java.util.concurrent.ReentrantLock 与 synchronized 的对比
两者都可以实现同步, 在有些方面二者还是有很多区别. synchronized 是 java 的一个语法级别的特性, ReentrantLock 是 util 里面的一个辅助类.
相同点:
- 二者都可以实现锁;
- 二者都可以实现 生产者/消费者模式 wait/notify/notifyAll, await/signal/signalAll
不同点:
- synchronized 必须是一对 {} 中间的部分, 2 个 synchronized 的代码块无法交叉, ReentrantLock 的写法更灵活, 可以交叉;
- Lock 可以设置是否回应 interrupt;
- Lock 可以使用 tryLock() 如果不能获得锁, 立马返回;
- Lock 可以使用 tryLock(timeout) 可以设置尝试获得锁的最长等待时间;
- 一个 Lock 可以通过 newCondition 设置多个条件队列, 让他们等待不同的事件;
- ReentrantLock 可以设置是否是公平锁;
- synchronized 在 JDK 6 优化之后, 可以实现锁粗化, 偏向锁, 根据逃逸分析锁消除;