ReentrantLock 是一种可重入的排它锁,主要用来解决多线程对共享资源竞争的问题。可以保证有序性、可见性、原子性。
这个类在java.util.concurrent.locks包下面。
特点:- 不会自动释放锁,可能会造成死锁,需要配合try finally进行释放锁。
- 可以通过Condition绑定多个条件,从而实现选择性通知
- 支持公平和非公平特性(默认是非公平)
- 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候,不需要加锁就可以直接访问。
- 用的是乐观锁机制。控制锁的代码由用于自定义,也采用CAS自旋锁进行了优化。
- 属于API层面,底层使用CAS和AQS实现,需要 lock() 和 unlock() 方法配合 try/finally 语句块来完成
锁的竞争
ReentrantLock 是通过互斥变量,使用 CAS 机制来实现的。
没有竞争到锁的线程,使用了 AbstractQueuedSynchronizer 这样一个队列同步器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从 AQS 队列里面的头部唤醒下一个等待锁的线程。
公平和非公平的特性
主要是体现在竞争锁的时候,是否需要判断 AQS 队列存在等待中的线程。
锁的重入特性
在 AQS 里面有一个成员变量来保存当前获得锁的线程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接增加重入次数。
暑期编程PK赛 得CSDN机械键盘等精美礼品!


