为了账号安全,请及时绑定邮箱和手机立即绑定

Java 中的重入锁

Java 中的重入锁

aluckdog 2021-12-10 15:36:51
我正在研究 Java 中的可重入锁定。需要对这个概念进行一定的澄清,了解它实际上是如何工作的。我对以下代码段的理解是什么:class Test{    public synchronized a(){          some code;      b();       some code;    }    public synchronized b(){           some code;    }}上面的代码有这种可重入锁问题的场景。我在这里的理解是,假设我们有两个线程:在测试共享对象上执行的应用程序中的 T1 和 T2。T1 或 T2 获取锁的任何人都在 a() 和 b() 上获取锁。先说T1并执行a()。当 a() 控制的执行到达 b(); 称呼。现在,在这种情况下,T1 期望此 b() 的新锁,或者因为它已经锁定了 b(),因此跳过锁定。需要有关此行为的详细解释以及上述代码中的问题的帮助。此外,可重入锁定机制将如何在此处提供帮助以及对此的片段和详细解释。
查看完整描述

2 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

可重入锁是一种允许线程在已经持有锁时再次(多次)获取锁的锁。

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

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

可重入锁通常使用引用计数来实现,该引用计数告诉锁定实现可重入的深度。


查看完整回答
反对 回复 2021-12-10
?
慕慕森

TA贡献1856条经验 获得超17个赞

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

a()被调用时,它调用b()你需要一个可重入的锁,否则线程会自己尝试第二次获取锁。它不会再次尝试获取锁,而是识别出它已经有一个锁b(),因此会增加一个计数器,这样当存在时,它不会释放锁而是递减计数器。


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信