Java高频面试题:什么是可重入锁?

大家好,我是锋哥。今天分享关于【Java高频面试题:什么是可重入锁?】面试题 。希望对大家有帮助;

Java高频面试题:什么是可重入锁?

可重入锁(Reentrant Lock),也叫递归锁(Recursive Lock),是一种允许同一个线程多次获取锁的锁机制。它的特点是,当一个线程已经持有该锁时,它可以再次请求并获取该锁,而不会被阻塞。每次锁的请求都会增加锁的计数,当计数为零时,锁才会被释放。

特点

  1. 线程可以重复获取锁:同一线程可以多次获取可重入锁,而不会死锁。
  2. 锁计数:每次获取锁时,锁的计数会增加,每次释放锁时,计数会减少。当计数为0时,锁才真正释放。
  3. 避免死锁:因为线程可以重新获得自己已经持有的锁,所以避免了传统锁机制中线程因反复请求同一把锁而死锁的问题。

举个例子

假设一个线程在执行某个方法时已经获得了锁,而该方法内部又调用了另一个需要锁的函数,在可重入锁的机制下,线程可以再次获得锁并继续执行,不会被阻塞。

复制代码
class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void methodA() {
        lock.lock();
        try {
            System.out.println("Method A is executing");
            methodB();  // 线程可以再次获得锁
        } finally {
            lock.unlock();
        }
    }

    public void methodB() {
        lock.lock();
        try {
            System.out.println("Method B is executing");
        } finally {
            lock.unlock();
        }
    }
}

在上面的例子中,methodA 锁住了 lock,在 methodA 内部调用 methodB 时,线程仍然能够获得该锁,因为它已经持有该锁。

应用场景

  • 递归调用:如果程序中存在递归调用,而且递归函数需要加锁,那么可重入锁就非常有用。
  • 避免死锁:当同一个线程需要多次访问同一个资源时,普通锁可能导致死锁,而可重入锁能保证顺利完成。

注意事项

  1. 锁的释放:每次获取锁后,必须确保在正确的位置释放锁,否则可能会引发锁泄漏的问题。
  2. 性能开销:可重入锁比普通锁有更多的开销,因为它需要维护锁的计数和检查递归获取。

总的来说,可重入锁是一种非常有用的机制,尤其适用于需要递归或同一线程多次请求同一个资源的情况。

相关推荐
DongQiShanRen7 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
潼心1412o7 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i7 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
cpolar技术支持7 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
wuminyu7 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
小蒜学长8 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔8 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
iCxhust8 小时前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机
殷色玫瑰9 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同9 小时前
java输入输出+方法
java·开发语言·python