为什么隐式锁没有发生死锁?

时间:2015-03-21 13:53:36

标签: java locking

What is the Re-entrant lock and concept in general?

  

如果锁是不可重入的,你可以抓住锁,然后阻止   你再次抓住它,有效地使你自己的过程陷入僵局。

public class ImplicitLock {

synchronized public void test1() {
    System.out.println("enter test1");
    test2();
    System.out.println("exit test1");

}

synchronized public void test2() {
    System.out.println("inside test2");

}

}

从主课,我执行

ImplicitLock lock1 = new ImplicitLock();
lock1.test1();

我得到了以下输出,但是当我按照SO隐式锁描述调用test2时我期待死锁但它没有

enter test1
inside test2
exit test1

2 个答案:

答案 0 :(得分:0)

Java同步锁是可重入的。 来自Jakob Jenkov的博客:

锁定重入

Java中的同步块是可重入的。这意味着,如果Java线程进入同步的代码块,从而对监视器对象的锁定进行同步,则该线程可以输入在同一监视器对象上同步的其他Java代码块。这是一个例子:

public class Reentrant{
    public synchronized outer(){
        inner();
    }
    public synchronized inner(){
        //do something
    }
}

取自:http://tutorials.jenkov.com/java-concurrency/locks.html

答案 1 :(得分:0)

你可以说隐式锁是可重入的。所以基本上如果你试图在同一个线程中锁定它两次就可以了,因为这个线程已经拥有了那个锁。

请参阅此处http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html

“可重入互斥锁具有与使用同步方法和语句访问的隐式监视器锁相同的基本行为和语义......”