当前位置:首页 > Java > 正文

深入理解ReentrantLock(Java并发编程中的可重入锁详解)

在Java多线程编程中,保证线程安全是至关重要的。除了使用synchronized关键字外,ReentrantLock 是 Java 提供的一种更灵活、功能更强大的锁机制。本教程将带你从零开始,深入浅出地掌握 ReentrantLock 的基本用法、核心特性以及常见应用场景。

什么是 ReentrantLock?

ReentrantLockjava.util.concurrent.locks 包中的一个类,它实现了 Lock 接口,提供了一种比 synchronized 更细粒度的线程同步控制方式。它的名字“可重入”意味着:同一个线程可以多次获取同一把锁而不会造成死锁。

深入理解ReentrantLock(Java并发编程中的可重入锁详解) ReentrantLock教程 Java并发锁 可重入锁使用 Java多线程同步 第1张

ReentrantLock 的基本使用

使用 ReentrantLock 需要手动加锁(lock())和释放锁(unlock())。为了确保锁一定被释放,通常建议将 unlock() 放在 finally 块中。

import java.util.concurrent.locks.ReentrantLock;public class Counter {    private int count = 0;    private final ReentrantLock lock = new ReentrantLock();    public void increment() {        lock.lock();  // 获取锁        try {            count++;        } finally {            lock.unlock();  // 释放锁        }    }    public int getCount() {        return count;    }}  

上面的例子中,increment() 方法通过 ReentrantLock 保证了对共享变量 count 的线程安全操作。

ReentrantLock 的核心特性

  • 可重入性:同一线程可以重复获取锁,内部维护一个计数器记录重入次数。
  • 公平锁与非公平锁:默认是非公平锁(效率更高),也可通过构造函数指定为公平锁(按请求顺序分配)。
  • 可中断:支持 lockInterruptibly(),允许线程在等待锁时响应中断。
  • 超时机制:可通过 tryLock(long timeout, TimeUnit unit) 尝试在指定时间内获取锁。

公平锁 vs 非公平锁

创建公平锁的方式如下:

ReentrantLock fairLock = new ReentrantLock(true);  // 公平锁ReentrantLock unfairLock = new ReentrantLock();   // 非公平锁(默认)  

公平锁虽然更“公平”,但会带来一定的性能开销,因此除非有特殊需求,一般使用默认的非公平锁即可。

使用 tryLock 避免死锁

tryLock() 方法允许你尝试获取锁,如果获取不到就立即返回或等待一段时间,非常适合用于避免死锁场景。

if (lock.tryLock()) {    try {        // 执行临界区代码    } finally {        lock.unlock();    }} else {    // 锁已被占用,执行其他逻辑    System.out.println("无法获取锁,稍后再试。");}  

ReentrantLock 与 synchronized 的对比

特性 ReentrantLock synchronized
可重入
可中断
超时机制
公平锁支持
自动释放 ❌(需手动 unlock)

总结

ReentrantLock 是 Java 并发编程中非常重要的工具,尤其适用于需要高级锁控制的场景。通过本教程,你应该已经掌握了它的基本语法、核心特性和最佳实践。记住:使用 ReentrantLock 时一定要在 finally 块中释放锁,否则可能导致死锁!

希望这篇 ReentrantLock教程 能帮助你更好地理解 Java并发锁 的工作机制。无论是开发高并发系统还是准备面试,掌握 可重入锁使用Java多线程同步 技术都至关重要。

继续练习吧!动手写几个多线程程序,亲自体验 ReentrantLock 的强大之处。