如果我有两个嵌套的锁 说(我在这里关注java)
synchronized (clientInfMutex) {
...
synchronized (clientInfMutex) {
//Will this part executable?
}
}
内部部分可执行吗?关注的是当外锁获得锁时,内锁可能无法再次锁定锁。如果内部部分不可执行,是否有机制,如果我已经锁定外锁,我将能够访问内部锁没有问题?感谢。
答案 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锁定的块中时,再次锁定无效。