ReentrantLock 和 synchronized 都是 Java 中用来实现线程同步的机制,但它们各自有不同的优缺点和适用场景。以下是它们的比较:
1. 基本概念
-
synchronized: 是 Java 内置的同步机制。可以在方法或代码块上使用,确保同一时间只有一个线程可以执行同步代码,其他线程会被阻塞直到获得锁。
-
ReentrantLock: 是 Java 5 引入的
java.util.concurrent.locks包中的显式锁,它提供了更灵活和更强大的锁机制。
2. 优缺点对比
| 特性 | synchronized | ReentrantLock |
|---|---|---|
| 锁的获取和释放 | 自动(隐式),在进入同步块/方法时获取,退出时自动释放 | 手动(显式),需要显式地调用 lock() 获取锁和 unlock() 释放锁 |
| 可中断性 | 不支持中断等待锁的线程 | 支持 lockInterruptibly(),可以中断等待中的线程 |
| 超时获取锁 | 不支持 | 支持 tryLock(long timeout, TimeUnit unit),可以尝试在一段时间内获取锁 |
| 公平锁 | 不支持公平锁,默认是非公平的 | 支持公平锁,通过 new ReentrantLock(true) 创建 |
| 锁投票 | 无显式锁投票概念 | 通过 tryLock() 可以实现非阻塞式尝试获取锁 |
| 条件等待 | 使用 wait() 和 notify()/notifyAll() 实现条件等待 | 提供了 Condition 对象,通过 await() 和 signal()/signalAll() 实现条件等待和通知 |
| 性能开销 | JVM 内置,性能较好,但在大量线程争用时可能出现锁竞争导致的性能问题 | 更灵活,但由于是显式控制,开销可能稍高,适合高并发场景下的精细控制 |
| 重入锁 | 支持 | 支持 |
| 可见性 | 通过内存屏障确保可见性 | 通过内存屏障确保可见性 |
| 锁优化 | JVM 对 synchronized 有诸如偏向锁、轻量级锁等优化 | 没有类似优化,但适合复杂锁控制 |
3. 使用场景
-
synchronized:
- 简单同步场景: 当你需要基本的线程同步时,
synchronized是一个直接有效的选择,代码简洁,适合大多数简单的锁场景。 - 偏向锁优化: 在轻量线程争用的场景下,JVM 会对
synchronized做性能优化(如偏向锁和轻量级锁)。 - 可维护性:
synchronized更容易阅读和维护,因为它是 Java 语言的原生同步机制。
- 简单同步场景: 当你需要基本的线程同步时,
-
ReentrantLock:
- 复杂同步需求: 当需要更细粒度的锁控制(如公平锁、可中断锁、超时获取锁等)时,
ReentrantLock是首选。 - 高并发环境: 在高并发情况下需要灵活控制锁的获取与释放时,可以使用
ReentrantLock。例如,等待中断、超时尝试获取锁。 - 条件等待: 如果你需要多个条件变量来控制线程的执行(例如使用
Condition来实现复杂的等待/通知机制),ReentrantLock提供了比synchronized更好的支持。
- 复杂同步需求: 当需要更细粒度的锁控制(如公平锁、可中断锁、超时获取锁等)时,
4. 示例
-
synchronized 使用示例:
public class SynchronizedExample { public synchronized void syncMethod() { // 同步方法 System.out.println("In synchronized method"); } public void syncBlock() { synchronized (this) { // 同步代码块 System.out.println("In synchronized block"); } } } -
ReentrantLock 使用示例:
import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private final ReentrantLock lock = new ReentrantLock(); public void performTask() { lock.lock(); try { // 临界区 System.out.println("In locked section"); } finally { lock.unlock(); } } }
总结
- 如果你只需要基本的锁机制并希望保持代码简洁,
synchronized是优先选择。 - 如果你需要更高的灵活性(如锁的可中断、超时等待、公平锁等),
ReentrantLock提供了更强大的功能,适合复杂的并发控制场景。

9102

被折叠的 条评论
为什么被折叠?



