相⽐于synchronized,ReentrantLock需要显式的获取锁和释放锁,相对现在基本都是⽤JDK7和JDK8的
版本,ReentrantLock的效率和synchronized区别基本可以持平了。他们的主要区别有以下⼏点:
1. 等待可中断,当持有锁的线程⻓时间不释放锁的时候,等待中的线程可以选择放弃等待,转⽽处理
其他的任务。
2. 公平锁:synchronized和ReentrantLock默认都是⾮公平锁,但是ReentrantLock可以通过构造函
数传参改变。只不过使⽤公平锁的话会导致性能急剧下降。
3. 绑定多个条件:ReentrantLock可以同时绑定多个Condition条件对象。
ReentrantLock基于AQS(AbstractQueuedSynchronizer 抽象队列同步器)实现。别说了,我知道问题
了,AQS原理我来讲。
AQS内部维护⼀个state状态位,尝试加锁的时候通过CAS(CompareAndSwap)修改值,如果成功设置为
1,并且把当前线程ID赋值,则代表加锁成功,⼀旦获取到锁,其他的线程将会被阻塞进⼊阻塞队列⾃
旋,获得锁的线程释放锁的时候将会唤醒阻塞队列中的线程,释放锁的时候则会把state重新置为0,同
时当前线程ID置为空。