一. 参考
-
ReentrantLock
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html?is-external=true -
ReentrantLock 实现原理
https://crossoverjie.top/2018/01/25/ReentrantLock/ -
谈谈 synchronized 和 ReentrantLock 的区别
https://cloud.tencent.com/developer/article/1459414 -
Synchronized 与 ReentrantLock 的区别!
https://www.cnblogs.com/javastack/p/12787771.html
二. 总结
-
是什么?
ReentrantLock 是一个可重入锁,基本功能类似与sychronized但是
多了一些扩展的能力 -
如何用?
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
-
ReentrantLock和sychronized区别
(1) ReentrantLock 可以提供公平锁和非公平锁, sychronized只能提供
非公平锁
(2) ReentrantLock 提供一种能够中断等待锁线程的机制,通过lock.lockInterruptibly()来实现这个机制,也就是说正在等待的线程可以选择放弃等待,改为处理其他事情.
(3) ReentrantLock 提供了一个Condition类,用来实现分组唤醒需要唤醒的线程们, 而不是像sychronized 使用notify或notifyAll要么随机唤醒一个线程,要么唤醒全部线程. -
若不使用3中的一些高级的功能,使用sychronized即可,因为其书写使用更加简洁. 新版优化后的性能不差于ReentrantLock