文章目录
相对于 synchronized 它具备如下特点:
- 可
中断
,别的线程可以打断
自己,避免自己竞争不到锁一直block,发生死锁 - 可以设置超时时间:
tryLock
,可以解决死锁
- 可以设置为公平锁,
一般不会用
- 支持
多个条件变量
,就是有多个waitset,不满足条件1去1里面的waitset,不满足条件2去2里面的waitset
与 synchronized 一样,都支持可重入
可打断:当没有获得锁时会block等待,在等待中被别的线程打断,会抛异常。
tryLock解决哲学家就餐问题:
口述:让共享资源(筷子对象)继承ReentrantLock,之前是用synchronized先锁左筷子再锁右筷子,但这样会导致左筷子获得了但是在获得右筷子时可能导致死锁,原因就是持有锁但是不释放还要争取另一个锁,导致死锁,使用ReentrantLock的tryLock,当获取不到另一个锁时释放已经获得的锁。
条件变量:
synchronized 中也有条件变量,就是我们讲原理时那个 waitSet 休息室,当条件不满足时进入 waitSet 等待,只不过有多个条件进入不同的waitSet
使用要点:
- await 前需要获得锁
- await 执行后,会释放锁,进入 conditionObject 等待
- await 的线程被唤醒(或打断、或超时)取重新竞争 lock 锁
- 竞争 lock 锁成功后,从 await 后继续执行