0

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

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


  }


}

内部部分可以执行吗?担心的是当外锁获得锁时,内锁可能无法再次锁定锁。如果内部无法执行,是否有一种机制,如果我已经持有外部锁中的锁,我将能够毫无问题地访问内部锁?谢谢。

4

3 回答 3

4

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

每次 JVM 遇到一个同步块时,它都会检查它是否有该锁,如果没有,则等待该锁,否则它会为该锁增加一个内部计数器,并执行封闭的块

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

于 2012-09-30T11:19:39.817 回答
2

这将工作得很好。如果线程已经通过synchronized块获得了锁,它可以多次重新获得。此功能称为可重入同步

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

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

public synchronized void bar() {
}

顺便说一句,您的示例中的两个代码块在同一个object上同步,而不是与您所称的名称相同。

于 2012-09-30T11:22:52.920 回答
0

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

于 2012-09-30T11:23:11.200 回答