我正在研究 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()
可重入锁通常使用引用计数来实现,该引用计数告诉锁定实现可重入的深度。
慕慕森
TA贡献1856条经验 获得超17个赞
如果锁不是可重入的,线程将无法b()
在持有进入时获得的锁时调用a()
。
当a()
被调用时,它调用b()
你需要一个可重入的锁,否则线程会自己尝试第二次获取锁。它不会再次尝试获取锁,而是识别出它已经有一个锁b()
,因此会增加一个计数器,这样当存在时,它不会释放锁而是递减计数器。
添加回答
举报
0/150
提交
取消