JAVA可重入锁

 

JAVA可重入锁

建议先阅读同步方法与静态同步方法各自的锁对象是谁

可重入锁的定义

可重入锁,指的是以线程为单位,当一个线程获取对象锁后,这个线程可以再次获取对象上的锁,而其他线程是不可以的

synchronized和ReentrantLock都是可重入锁

实现原理

实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程.当计数器为0时,认为锁是未被占有的;线程请求一个未被占有的锁时,JVM将记录锁的占有者,并且请求计数器置为一.如果同一个线程再次请求这个锁,计数器将递增;每次占有的线程退出同步块,计数器将递减.直到计数器为0,锁被释放

示例

public synchronized void method1() {
       method2();
  }

public synchronized void method2() {
       System.out.println("普通方法method2执行开始");
     
}

在方法method1()中可以调用method2()

如果synchronized不是可重入锁,那么将无法调用method2(),并形成死锁,原因参考同步方法与静态同步方法各自的锁对象是谁

 

参考文档地址1: JAVA可重入锁与不可重入锁

参考文档地址2: 一个线程执行synchronized同步代码时,再次重入该锁过程中,如果抛出异常,会释放锁吗

 

posted @ 2022-03-23 22:41  进击的小蔡鸟  阅读(727)  评论(0编辑  收藏  举报