首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的可重入锁定

Java中的可重入锁定
EN

Stack Overflow用户
提问于 2018-10-27 19:05:01
回答 2查看 842关注 0票数 4

我当时正在研究Java中的可重入锁。需要对这个概念进行某些澄清,即它实际上是如何工作的。下面是我所理解的代码片段:

代码语言:javascript
复制
class Test{
    public synchronized a(){   
       some code;
      b();
       some code;
    }
    public synchronized b(){    
       some code;
    }

}

上面的代码有这个可重入锁问题的场景。

我在这里所理解的是,假设我们有两个线程:在测试共享对象上执行应用程序中的T1和T2。

无论T1或T2获取a()和b()上的锁获取。让我们先说T1,然后执行一个()。而a()控件的执行到达b();调用。现在在这种情况下,T1期望这个b()有一个新的锁,或者因为它已经锁定了b(),所以锁被跳过了。

需要帮助详细解释此行为以及上述代码中的问题。另外,可重入锁定机制将如何在这里提供帮助,以及代码片段和详细解释。

EN

回答 2

Stack Overflow用户

发布于 2018-10-27 21:44:32

可重入锁是允许线程在已经持有锁的情况下再次(多次)获取锁的锁。

例如,如果线程T1在对象上调用a(),则a()方法将获取对象上的锁,并开始执行主体。当a的主体调用b()时,b()调用“可重入地”获得相同的锁。当b()调用返回时,a()调用仍然持有锁。只有当a()调用返回时,才会释放锁。

(假设,如果Java原语锁不是可重入的,那么序列T1调用a(),然后调用b()可能会死锁,或者抛出异常...)

可重入锁通常使用引用计数来实现,它告诉锁定实现可重入性有多深。

另请参阅:https://stackoverflow.com/a/16504266/139985

票数 6
EN

Stack Overflow用户

发布于 2018-10-27 19:19:47

如果锁不是可重入的,线程就不能在持有进入a()时获得的锁的同时调用b()

a()被调用时,它调用了b(),你需要一个可重入的锁,否则线程将会活动锁,试图再次获取锁。当b()存在时,它不会释放锁,而是会递减计数器,而不是再次尝试获取锁。

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

https://stackoverflow.com/questions/53021263

复制
相关文章

相似问题

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