【java】——什么是可重入锁以及实际应用场景

首先锁是针对线程的,即只有线程才有锁的概念。

什么是可重入锁呢?

当一个线程获取了某个对象锁以后,还可以再次获得该对象锁。

什么时候我们会用到可重入锁呢?

看下面的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时,线程就释放了该对象,其他线程才能获取该锁

    原文作者:java锁
    原文地址: https://blog.csdn.net/startyangu/article/details/83933416
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞