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免费学习笔记(深入)”;
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 能提升程序的并发控制能力,特别是在需要超时、中断或条件等待等场景下优势明显。
以上就是Java中ReentrantLock核心用法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/64480.html
微信扫一扫
支付宝扫一扫