相对于
synchronized
它具备如下特点
可中断
可以设置超时时间
可以设置为公平锁
支持多个条件变量
与
synchronized
一样,都支持可重入
可重入
可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁
如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住
可打断
获取锁时调用这个方法
lock
.
lockInterruptibly
();
注意如果是不可中断模式,那么即使使用了
interrupt
也不会让等待中断
锁超时
尝试获取锁,如果不成功,它就不会等待下去,也可以设置等待时间
lock
.
tryLock
()
lock
.
tryLock
(
1
,
TimeUnit
.
SECONDS
)
可以使用
tryLock
解决哲学家就餐问题 synchronized无法解决,是因为它是无限制的等待,而tryLock可以有时限的等待,没有获取到锁就不等待。
公平锁
ReentrantLock
默认是不公平的
公平锁一般没有必要,会降低并发度
条件变量
synchronized
中也有条件变量,就是我们讲原理时那个
waitSet
休息室,当条件不满足时进入
waitSet
等待
ReentrantLock
的条件变量比
synchronized
强大之处在于,它是支持多个条件变量的,这就好比
synchronized
是那些不满足条件的线程都在一间休息室等消息
而
ReentrantLock
支持多间休息室,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤醒
使用要点:
await
前需要获得锁
await
执行后,会释放锁,进入
conditionObject
等待
await
的线程被唤醒(或打断、或超时)取重新竞争
lock
锁
竞争
lock
锁成功后,从
await
后继续执行