首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同名嵌套锁

同名嵌套锁
EN

Stack Overflow用户
提问于 2012-09-30 19:18:26
回答 3查看 196关注 0票数 0

如果我有两个锁嵌套,比如说(我在这里是关于java的)

代码语言:javascript
复制
synchronized (clientInfMutex) {
...
    synchronized (clientInfMutex) {
        //Will this part executable?


  }


}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-30 19:19:40

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

每当JVM命中同步块时,它都会检查它是否拥有该锁,如果没有,则等待该锁,否则它会递增该锁的内部计数器,并执行包含的块

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

票数 4
EN

Stack Overflow用户

发布于 2012-09-30 19:22:53

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

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

代码语言:javascript
复制
public synchronized void foo() {
    bar();  //will NEVER block
}

public synchronized void bar() {
}

顺便说一句,示例中的两个代码块在同一个对象上同步,而不是在您调用的同一名称上同步。

票数 2
EN

Stack Overflow用户

发布于 2012-09-30 19:23:11

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12660821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档