首先锁是针对线程的,即只有线程才有锁的概念。
什么是可重入锁呢?
当一个线程获取了某个对象锁以后,还可以再次获得该对象锁。
什么时候我们会用到可重入锁呢?
看下面的demo
public class Demo1 {
public synchronized void functionA(){
System.out.println("iAmFunctionA");
functionB();
}
public synchronized void functionB(){
System.out.println("iAmFunctionB");
}
}
代码解释
functionA()和functionB()都是同步方法,当线程进入funcitonA()会获得该类的对象锁,这个锁”new Demo1()”,在functionA()对方法functionB()做了调用,但是functionB()也是同步的,因此该线程需要再次获得该对象锁(new Demo1())。其他线程是无法获该对象锁的。
这就是可冲入锁。
可重入锁的作用就是为了避免死锁,java中synchronized和ReentrantLock都是可重入锁
重入锁的实现原理
通过为每个锁关联一个请求计数器和一个获得该锁的线程。当计数器为0时,认为锁是未被占用的。线程请求一个未被占用的锁时,JVM将记录该线程并将请求计数器设置为1,此时该线程就获得了锁,当该线程再次请求这个锁,计数器将递增,当线程退出同步方法或者同步代码块时,计数器将递减,当计数器为0时,线程就释放了该对象,其他线程才能获取该锁