嵌套锁具有相同的名称

时间:2012-09-30 11:18:26

标签: java multithreading synchronization mutex

如果我有两个嵌套的锁 说(我在这里关注java)

synchronized (clientInfMutex) {
...
    synchronized (clientInfMutex) {
        //Will this part executable?


  }


}

内部部分可执行吗?关注的是当外锁获得锁时,内锁可能无法再次锁定锁。如果内部部分不可执行,是否有机制,如果我已经锁定外锁,我将能够访问内部锁没有问题?感谢。

3 个答案:

答案 0 :(得分:4)

是。 因为线程已经有锁。 在Java中,本机锁是可重入

每当JVM命中同步块时,它会检查它是否具有该锁定,如果没有,则它等待该锁定,否则它会增加该锁定的内部计数器,并执行所附的块

请注意,这假设clientInfMutex指向两个语句中的同一个对象。例如,如果您在两个同步块之间执行了clientInfMutex = new Object(),那么您的线程将等待新对象的锁定。

答案 1 :(得分:2)

这样可以正常工作。如果线程已通过synchronized块获得锁定,则可以多次重新获取它。此功能称为reentrant synchronization

请注意,如果隐式使用this作为同步器,这也有效:

public synchronized void foo() {
    bar();  //will NEVER block
}

public synchronized void bar() {
}

BTW示例中的两个代码块在同一个对象上进行同步,而不是在您调用的同一名称上进行同步。

答案 2 :(得分:0)

Java中的每个Object实例都包含一个锁定引用。这意味着您使用的双锁实际上只锁定对象一次。这也意味着当您处于被Object锁定的块中时,再次锁定无效。