ReentrantLock提供比synchronized更灵活的同步控制,支持可中断、超时获取锁、公平性等特性,需显式加锁并用finally确保释放,适用于需精细控制并发的场景。

ReentrantLock 是 Java 并发包(java.util.concurrent.locks)中一个重要的可重入互斥锁,相比 synchronized 提供了更灵活的加锁机制。它能实现与 synchronized 相同的基本同步功能,但支持更多高级特性,比如可中断、超时获取锁、公平锁等。
基本使用方式
使用 ReentrantLock 需要显式地加锁和释放锁,通常配合 try-finally 语句块确保锁能正确释放。
示例代码:
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 临界区操作
} finally {
lock.unlock();
}
}
注意:unlock() 必须放在 finally 块中,防止因异常导致锁无法释放。
可中断获取锁(lockInterruptibly)
当线程在等待获取锁的过程中可以被其他线程中断,避免无限等待。
立即学习“Java免费学习笔记(深入)”;
MMM金融互助系统源码是以thinkphp为核心进行开发的3m金融互助平台。程序安装说明:1.恢复数据:将“数据备份”文件夹中的 urkeji.sql 文件请采用phpMyAdmin进行导入; 2.配置Sql数据库信息,文件路径:根目录下 config.php3.后台管理地址:http://域名/admin.php 用户名:100000 密码:admin1
public void interruptibleMethod() throws InterruptedException {
lock.lockInterruptibly();
try {
// 执行需要同步的操作
} finally {
lock.unlock();
}
}
如果当前线程在等待锁时被中断,会抛出 InterruptedException。
尝试获取锁(tryLock)
tryLock 允许线程非阻塞地尝试获取锁,也可以设置超时时间。
- boolean tryLock():立即返回结果,获取到锁返回 true,否则返回 false。
- boolean tryLock(long timeout, TimeUnit unit):在指定时间内尝试获取锁,成功返回 true,超时返回 false。
public boolean timedOperation() {
if (lock.tryLock()) {
try {
// 执行操作
return true;
} finally {
lock.unlock();
}
} else {
System.out.println("获取锁失败,跳过操作");
return false;
}
}
公平锁与非公平锁
ReentrantLock 支持构造公平锁,保证等待时间最长的线程优先获取锁。
- new ReentrantLock():默认为非公平锁,性能更高。
- new ReentrantLock(true):创建公平锁,按请求顺序获取锁。
公平锁虽然避免了线程“饥饿”,但吞吐量通常低于非公平锁。
基本上就这些核心用法。合理使用 ReentrantLock 能提升程序的并发控制能力,特别是在需要超时、中断或条件等待等场景下优势明显。









