调用在另一个同步内同步

Kas*_*sra 1 java multithreading synchronized

第1部分:

假设以下代码

void method1(){

    synchronized (lockObject){
        method2();
        System.out.println("line4");
    }

}

void method2(){
    System.out.println("line1");

    synchronized (lockObject){
        System.out.println("line2");
    }

    System.out.println("line3");
}
Run Code Online (Sandbox Code Playgroud)

这是一个僵局吗?这是一个安全的代码吗?输出总是:

line1
line2 
line3
line4
Run Code Online (Sandbox Code Playgroud)

第2部分:

如果在另一个线程上执行method2()怎么办?输出会不同吗?像这样:

void method1(){

    synchronized (lockObject){
        method2();
        System.out.println("line4");
    }

}

void method2(){
        newThread= new Thread(new Runnable() {
            @Override
            public void run() {     
                System.out.println("line1");
                synchronized (lockObject){
                    System.out.println("line2");
                }
                System.out.println("line3");
            }
        }).start();
}
Run Code Online (Sandbox Code Playgroud)

我猜第二个代码的输出可以是:

line4
line1 
line2
line3
Run Code Online (Sandbox Code Playgroud)

它是否正确?

Zie*_*elu 6

是的,您可以在同一个对象上多次同步而不会出现死锁,它的工作方式就像是重入锁定.

至于输出.第一个是简单的顺序输出,同步不会影响它.第二个将产生预期的输出,因为另一个线程将不得不等待第一个释放lockObject.

编辑,line1和line4的顺序未确定,因为之前没有同步.line2和line3总是在line4之后,因为第二个线程无法开始打印line1,直到第一个线程离开method1同步块.