锁的可重入性Reentrancy理解

2020-06-30  本文已影响0人  Mr_Editor

当一个线程请求其他线程已经占有的锁时,请求线程将被阻塞。synchronized是reentrancy lock ,当线程在试图获得它自己占有的锁时,请求会成功。

reentrancy 可重入意味着在请求锁时是基于“每线程(per-thread)”,而不是基于“每调用(per-invocation)”。

public class ReentrancyDemo{
  public synchronized void test1(){
    //.....业务代码
    test2();      //方法test2可执行,如果synchronized 不可重入,会产生死锁
  }
  public synchronized void test2(){
    //...业务代码
  }

}

reentrancy 的实现是通过为每个锁关联一个请求计数器(acquisition count)和一个占有它的线程。计数器为0时,认为锁是未被占有的。线程请求一个未被占有的锁时,JVM将记录锁的占有者(占有线程),并将请求计数设置为1。如果同一线程再次请求这个锁,计数将递增;每次占用线程退出同步块,计数器值将递减,直到计数器达到0时,锁被释放。

上一篇 下一篇

猜你喜欢

热点阅读