Java ReentrantLock的可重入性与公平锁机制详解

 更新时间:2026年02月14日 15:34:34   作者:晔子yy  
这篇文章主要介绍了Java ReentrantLock的可重入性与公平锁机制,Java中的ReentrantLock是一个可重入的互斥锁,基于AQS实现,它允许同一线程多次获取同一把锁,并控制加锁与释放,支持公平/非公平策略及tryLock等灵活特性,需要的朋友可以参考下

1.ReentrantLock介绍

ReentrantLock​ 是Java 并发包(java.util.concurrent.locks)中提供的一个可重入互斥锁,功能类似于synchronized关键字,但提供了更灵活的锁控制机制。

2.ReentrantLock核心特性

2.1可重入性

同一个线程可以多次获取同一把锁,而不会产生死锁

ReentrantLock lock = new ReentrantLock();
public void func1() {
    lock.lock();
    try {
        inner();
    } finally {
        lock.unlock();
    }
}
public void func2() {
    lock.lock();  // 同一个线程可以再次获取锁
    try {
        // 操作
    } finally {
        lock.unlock();
    }
}

2.2公平性选择

支持公平锁和非公平锁两种模式

默认使用非公平锁,非公平锁和公平锁的区别在于公平锁多了判断在等待队列中是否已经有线程在排队的条件。

  • 非公平锁:默认,吞吐量高
  • 公平锁:按等待时间分配,避免饥饿
// 非公平锁
ReentrantLock unfairLock = new ReentrantLock();
// 公平锁
ReentrantLock fairLock = new ReentrantLock(true);

2.3中断响应

支持在等待锁的过程中响应中断

使用lock.lockInterruptibly()即可设置可中断的获取锁

public void method() throws InterruptedException {
    lock.lockInterruptibly();  // 可中断的获取锁
    try {
        // 操作
    } finally {
        lock.unlock();
    }
}

2.4超时机制

  • tryLock():立即返回是否获取成功
  • tryLock(long timeout, TimeUnit unit):带超时的尝试

3.ReentrantLock基本使用方法

我们来模拟一个简单的多线程环境下对单一共享变量做更改的场景

public class Counter {
    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;
    public void increment() {
        lock.lock();  // 获取锁
        try {
            count++;
        } finally {
            lock.unlock();  // 必须放在finally中确保释放
        }
    }
}

和sychronized类似,其本质都是将需保证线程安全的变量放到代码块中,使用锁将代码块包裹。不一样的点在于Reentrantlock需要手动释放锁,为了保证每次使用锁后安全地释放,我们使用finally关键字去实现锁的释放。

4.ReentrantLock和sychronized对比

synchronized和ReentrantLock都是Java 中提供的可重入锁,但却有着较多的不同点

ReentrantLock与synchronized对比

ReentrantLocksynchronized
实现方式Java代码实现JVM内置(C/C++)
锁获取方式手动 lock()/unlock()自动获取/释放
可中断性lockInterruptibly()不支持
超时机制tryLock()不支持
公平锁支持不支持
性能优化AQS+CAS锁升级

虽说在性能上二者相差无几,但是ReentrantLock提供了更多可选的功能,灵活性要比传统synchronized锁要更高,所以在大部分场景中,我们会选择使用ReentrantLock作为第一选择,而synchronized因为其有着自动获取和释放锁的优势,在简单的业务场景中会经常看见它的身影。

5.ReentrantLock使用主要事项

5.1锁的释放

由于ReentrantLock没有提供自动获取和释放锁,所以在每次使用完后必须手动释放

lock.lock();
try {
    // 临界区代码
} finally {
    lock.unlock();
}

5.2锁的层级嵌套

虽然ReentrantLock支持可重入锁,但是随着嵌套层级增加,代码可读性会大大下降

//嵌套层次过深
public void methodA() {
    lock.lock();
    try {
        methodB();
    } finally {
        lock.unlock();
    }
}
public void methodB() {
    lock.lock();  // 再次获取
    try {
        // ...
    } finally {
        lock.unlock();
    }
}

以上就是Java ReentrantLock的可重入性与公平锁机制详解的详细内容,更多关于Java ReentrantLock的资料请关注脚本之家其它相关文章!

相关文章

  • Java中增强for循环代码示例

    Java中增强for循环代码示例

    这篇文章主要给大家介绍了Java中增强for循环的相关资料,for/in循环就是JDK5.0中所谓的增强For循环,它能对数组和集合进行遍历,使用它会使用你的代码短小而精炼的多,需要的朋友可以参考下
    2023-10-10
  • Java程序执行过程及内存机制详解

    Java程序执行过程及内存机制详解

    本讲将介绍Java代码是如何一步步运行起来的,还会介绍Java程序所占用的内存是被如何管理的:堆、栈和方法区都各自负责存储哪些内容,感兴趣的朋友跟随小编一起看看吧
    2020-12-12
  • Spring的Aware接口你知道多少

    Spring的Aware接口你知道多少

    这篇文章主要为大家详细介绍了Spring的Aware接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Springboot FatJa原理机制源码解析

    Springboot FatJa原理机制源码解析

    这篇文章主要为大家介绍了Springboot FatJa原理机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringBoot实现项目健康检查与监控

    SpringBoot实现项目健康检查与监控

    这篇文章主要介绍了SpringBoot实现项目健康检查与监控,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Java page cache回写机制案例详解

    Java page cache回写机制案例详解

    这篇文章主要介绍了Java page cache回写机制案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • spring boot实战之本地jar包引用示例

    spring boot实战之本地jar包引用示例

    本篇文章主要介绍了spring boot实战之本地jar包引用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java Excel Poi字体颜色自定义设置代码

    Java Excel Poi字体颜色自定义设置代码

    最近项目使用POI按模板导出Excel,需要设置单元格的字体为红色,下面这篇文章主要给大家介绍了关于Java Excel Poi字体颜色自定义设置的相关资料,需要的朋友可以参考下
    2024-01-01
  • java组件commons-fileupload实现文件上传

    java组件commons-fileupload实现文件上传

    这篇文章主要介绍了java借助commons-fileupload组件实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • IntelliJ IDEA 好用插件之analyze inspect code详解

    IntelliJ IDEA 好用插件之analyze inspect code详解

    这篇文章主要介绍了IntelliJ IDEA 好用插件之analyze inspect code的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-12-12

最新评论