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:
参考文档地址2: