彻底理解ReentrantLock.md - omigaw/spring- GitHub Wiki
1. ReentrantLock的介绍
ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性、表示能够对共享资源重复加锁,即当前线程获取该锁再次获取不会被阻塞。同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全全的弄懂ReentrantLock的话,主要也就是ReentrantLock同步语义的学习:
* 重入性的实现原理
* 公平锁和非公平锁
2. 重入性的实现原理
为了支持重入性,如果该锁已经被线程占有了,会继续检查占有线程是否为当前线程,如果是的话,同步状态加1返回true,表示可以再次获取成功,每次重新获取都会对同步状态进行加一的操作。
3. 公平锁与非公平锁
- 公平锁每次获取到锁为同步队列中的第一个节点,保证请求资源时间上的绝对顺序,而非公平锁有可能刚释放锁的线程下次继续获取该锁,则有可能导致其他线程永远无法获取到锁,造成"饥饿"现象。
- 公平锁为了保证时间上的绝对顺序,需要频繁的上下文切换,而非公平锁会降低一定的上下文切换,降低性能开销。因此,ReentrantLock默认选择的是非公平锁,则是为了减少一部分上下文切换,保证了系统更大的吞吐量。