java基本多线程

Ser*_*nov -1 java multithreading synchronized

为什么下面的代码不是死锁而且运行正常?

public class Concurrent {

    public static void main(String[] args) {
        Concurrent my = new Concurrent();
        my.method1();

    }

    private synchronized void method1() {
        System.out.println("method1");
        method2();
    }

    private synchronized void method2() {
        System.out.println("method2");
    }
}

Output:
method1
method2
Run Code Online (Sandbox Code Playgroud)

当我调用method1()时,监视器被锁定.JVM或编译器无法调用method2(),因为此方法也由"my"对象的监视器同步.但它运作正常.

Ste*_*n C 5

为什么问题中的代码没有死锁?

因为原始互斥(监视器)是可重入的.当给定互斥锁内的线程尝试再次获取它时,它不会阻塞.

JLS 17.1:

"线程t可能会多次锁定特定的监视器;每次解锁都会反转一次锁定操作的效果."