synchronized是Java内置的隐式锁,使用简单且由JVM自动管理锁的获取与释放,适合大多数简单的同步场景,具备良好的性能优化(如偏向锁、轻量级锁);而ReentrantLock是显式锁,需手动调用lock()和unlock(),提供了更灵活的控制能力,如公平锁、非阻塞尝试获取锁(tryLock)、可中断锁获取(lockInterruptibly)以及多条件变量(Condition),适用于复杂并发控制需求。随着JVM对synchronized的持续优化,二者在性能上的差距已不明显,选择时应优先考虑功能需求:若无需高级特性,synchronized更简洁安全;若需精细控制,则应选用ReentrantLock。

synchronized
ReentrantLock
synchronized
ReentrantLock
java.util.concurrent.locks
在我看来,理解
synchronized
ReentrantLock
synchronized
synchronized
然而,这把“普通钥匙”也有它的局限性。比如说,你不能选择这把钥匙是“公平”地分配给等待最久的那个线程,还是“不公平”地让刚到的线程也可能插队。它也不支持尝试获取锁(
tryLock
synchronized
这时候,
ReentrantLock
lock()
finally
unlock()
ReentrantLock
synchronized
ReentrantLock
new ReentrantLock(true)
tryLock()
lockInterruptibly()
synchronized
ReentrantLock
Condition
ReentrantLock
Condition
ReentrantLock
Condition
Condition
Object
wait()/notify()
Object
从性能角度看,早期
ReentrantLock
synchronized
synchronized
synchronized
ReentrantLock
synchronized
synchronized
ReentrantLock
在我日常的开发中,如果同步需求比较简单,我通常会毫不犹豫地选择
synchronized
unlock()
比如,你只是想保护一个计数器,或者一个简单的共享变量的读写操作,用
synchronized
synchronized
ReentrantLock
ReentrantLock
synchronized
synchronized
ReentrantLock
在我看来,
ReentrantLock
synchronized
ReentrantLock
最典型的例子就是需要非阻塞地尝试获取锁。想象一下,你有一个任务,它需要访问某个资源,但如果这个资源被锁住了,你不想让它一直等下去,而是希望它能立即去做别的事情,或者过一会儿再尝试。这时候
ReentrantLock
tryLock()
ReentrantLock lock = new ReentrantLock();
// ...
if (lock.tryLock()) {
try {
// 访问临界区资源
System.out.println(Thread.currentThread().getName() + " 成功获取锁并执行任务。");
} finally {
lock.unlock();
}
} else {
// 锁被其他线程持有,执行备用方案或稍后重试
System.out.println(Thread.currentThread().getName() + " 未能获取锁,执行其他操作。");
}这比
synchronized
另一个不可或缺的场景是可中断的锁获取。设想一个长时间运行的任务,它需要获取一个锁。如果用户突然取消了这个任务,你肯定希望它能尽快停止,而不是继续等待一个遥遥无期的锁。
ReentrantLock
lockInterruptibly()
InterruptedException
此外,多条件变量的需求也是
ReentrantLock
ReentrantLock
newCondition()
Condition
Condition
Object
wait()/notifyAll()
最后,如果你对锁的公平性有严格要求,比如你希望等待时间最长的线程能够优先获取锁,那么
ReentrantLock
new ReentrantLock(true)
synchronized
在我刚接触 Java 并发编程的那些年,
ReentrantLock
synchronized
ReentrantLock
然而,随着 Java 虚拟机(JVM)的不断演进,尤其是从 JDK 6 开始,
synchronized
synchronized
这些优化使得
synchronized
ReentrantLock
ReentrantLock
lock()
unlock()
Condition
所以,我现在的看法是,性能不再是选择 synchronized
ReentrantLock
ReentrantLock
synchronized
ReentrantLock
以上就是synchronized 和 ReentrantLock 的异同点是什么?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号