2015-10-15 53 views
-1

为什么下面的代码不是死锁并且工作正常?java基本多线程

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 

当我调用method1()监视器被锁定。 JVM或编译器无法调用method2(),因为此方法也通过监视“my”对象进行同步。但它工作正常。

回答

5

为什么问题中的代码不会死锁?

由于原始互斥量(监视器)是可重入的。当给定互斥体中的线程尝试再次获取它时,它不会阻塞。

JLS 17.1

“A线程t可能会锁定特定的监视器多次;每个解锁反转一个锁定操作的效果”。

+0

感谢您的解释,我认为如果我需要一个可重入的锁,我应该使用java.util.concurrent.locks.ReentrantLock。此外,我认为我的问题中的代码是死锁,但jvm或编译器“优化”我的代码以防止死锁。 –