Java synchronized关键字用法(2)

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    staticMethodSynchronized.method1();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }, "t1");
        Thread t2 = new Thread(new Runnable() {

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    staticMethodSynchronized.method2();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }, "t2");
        t1.start();
        t2.start();
    }
}

在上述代码中创建了两个线程并命名为 t1,t2。 t1,t2 线程调用了 staticMethodSynchronized 类的两个静态同步方法 method1 和 method2。执行结果如下:

Java synchronized关键字用法

在 t1 线程开始执行后,即使 t1 线程睡眠了5s,线程 t2 中的 method2 方法仍然没有得到执行。这是因为 t1 线程先执行的 method1 方法,持有了staticMethodSynchronized 类对象的锁,且 method1 方法并没有执行完,staticMethodSynchronized 类对象的锁没有被释放,所以 comeInIn 方法无法对staticMethodSynchronized 类对象加锁,就无法继续执行,只能等到 t1 线程中的 method1 方法执行完毕,释放 staticMethodSynchronized 类对象的锁,method2 方法才能继续执行。

三、实例方法中使用 synchronized 关键字制造同步块

同步块中默认被加锁的对象是此同步块括号声明中包含的对象。

class ImmutableValue {
    public synchronized void comeIn() throws InterruptedException{
        System.out.println(Thread.currentThread().getName() + ": start");
        Thread.sleep(5000);
        System.out.println(Thread.currentThread().getName() + ": finish");
    }
    public void comeInIn() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + ": start");
        synchronized(this) {
           
        }
        System.out.println(Thread.currentThread().getName() + ": finish");
    }
}
public class TestImmutableValue {
    public static void main(String[] args) {
        ImmutableValue im = new ImmutableValue();
        Thread t1 = new Thread(new Runnable() {

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    im.comeIn();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }, "t1");
        Thread t2 = new Thread(new Runnable() {

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/98ff92272ae108682121765bfe4a0b23.html