如果我有两个嵌套的锁说(我在这里关注java)</p>
synchronized (clientInfMutex) {
...
synchronized (clientInfMutex) {
//Will this part executable?
}
}
内部部分可以执行吗?担心的是当外锁获得锁时,内锁可能无法再次锁定锁。如果内部无法执行,是否有一种机制,如果我已经持有外部锁中的锁,我将能够毫无问题地访问内部锁?谢谢。
如果我有两个嵌套的锁说(我在这里关注java)</p>
synchronized (clientInfMutex) {
...
synchronized (clientInfMutex) {
//Will this part executable?
}
}
内部部分可以执行吗?担心的是当外锁获得锁时,内锁可能无法再次锁定锁。如果内部无法执行,是否有一种机制,如果我已经持有外部锁中的锁,我将能够毫无问题地访问内部锁?谢谢。
是的。因为线程已经拥有了锁。在 Java 中,本机锁是可重入的
每次 JVM 遇到一个同步块时,它都会检查它是否有该锁,如果没有,则等待该锁,否则它会为该锁增加一个内部计数器,并执行封闭的块
请注意,这是假设clientInfMutex
在两个语句中都指向相同的对象。例如,如果您clientInfMutex = new Object()
在两个同步块之间执行了 a,那么您的线程将等待新对象的锁定。
这将工作得很好。如果线程已经通过synchronized
块获得了锁,它可以多次重新获得。此功能称为可重入同步。
请注意,如果this
隐式用作同步器,这也有效:
public synchronized void foo() {
bar(); //will NEVER block
}
public synchronized void bar() {
}
顺便说一句,您的示例中的两个代码块在同一个object上同步,而不是与您所称的名称相同。
Java 中的每个 Object 实例都拥有一个锁引用。这意味着您使用的双锁实际上只锁定对象一次。这也意味着当您处于被对象锁定的块中时,再次锁定没有任何效果。