代码之家  ›  专栏  ›  技术社区  ›  Neeraj

Java中的可重入锁定

  •  2
  • Neeraj  · 技术社区  · 8 年前

    我正在研究Java中的可重入锁定。需要对这个概念进行一定的澄清,说明它是如何工作的。我对以下代码片段的理解是什么:

    class Test{
        public synchronized a(){   
           some code;
          b();
           some code;
        }
        public synchronized b(){    
           some code;
        }
    
    }
    

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

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

    无论是T1还是T2获得了A()和B()上的lock acquire。先说T1,然后执行()。当a()控件的执行达到b()时;调用。现在在这种情况下,T1期望这个b()有一个新的锁,或者因为它已经对b()有了锁,所以跳过了锁。

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

    提前感谢您的帮助。 当做。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Stephen C    8 年前

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

    例如,如果线程 T1 电话 a() 在一个物体上, () 方法获取对象的锁,并开始执行主体。当身体 a 电话 b() , the b-() 调用“Reentrantly”获得相同的锁。当 b-() 呼叫返回 () 呼叫是 仍然 握住锁。只有当 () 呼叫返回。

    (假设,如果Java原始锁不是可重入的,那么序列 T1 电话 () 然后呼叫 b-() 可能会死锁,或者抛出异常…)

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

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

        2
  •  2
  •   Peter Lawrey    8 年前

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

    什么时候? () 被调用,它调用 b-() 您需要一个可重入的锁,否则线程将自己激活锁,尝试再次获取锁。它不再尝试再次获取锁,而是识别它已经有一个锁递增一个计数器,这样当 b-() 存在,它不会释放锁,而是递减计数器。