如果我有两个锁嵌套,比如说(我在这里是关于java的)
synchronized (clientInfMutex) {
...
synchronized (clientInfMutex) {
//Will this part executable?
}
}内部部分是可执行的吗?令人担忧的是,当外部锁获得锁时,内部锁可能无法再次锁定锁。如果内部部分是不可执行的,有没有一种机制,如果我已经在外部锁中持有锁,我将能够毫无问题地访问内部锁?谢谢。
发布于 2012-09-30 19:19:40
是。因为线程已经拥有锁了。在Java语言中,本地锁是可重入的
每当JVM命中同步块时,它都会检查它是否拥有该锁,如果没有,则等待该锁,否则它会递增该锁的内部计数器,并执行包含的块
请注意,这是假设clientInfMutex在两个语句中指向相同的对象。例如,如果你在两个同步块之间做了一次clientInfMutex = new Object(),那么你的线程将等待新对象的锁。
发布于 2012-09-30 19:22:53
这将会工作得很好。如果线程已经通过synchronized块获得了锁,它可以多次重新获得它。此功能称为reentrant synchronization。
请注意,如果this被隐式用作同步器,这也是有效的:
public synchronized void foo() {
bar(); //will NEVER block
}
public synchronized void bar() {
}顺便说一句,示例中的两个代码块在同一个对象上同步,而不是在您调用的同一名称上同步。
发布于 2012-09-30 19:23:11
Java中的每个Object实例都拥有一个锁引用。这意味着您正在使用的双锁实际上只锁定了对象一次。这也意味着,当您处于由对象锁定的块中时,再次锁定不会产生任何效果。
https://stackoverflow.com/questions/12660821
复制相似问题