说下ReentrantLock原理和synchronized有什么区别?

相⽐于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置为空。

你可能感兴趣的:(说下ReentrantLock原理和synchronized有什么区别?)