1:ReentrantLock的介绍
ReentrantLock是java的并发包JUC下的一种锁机制.其继承了LOCK接口,功能与synchronized锁相似,由此经常会与synchronized锁进行对比.
2:ReentrantLock与synchronized的区别
相同点: 两者都是 独占锁, 都可重入
不同点:
1:synchronized是自动加锁,解锁,不需要代码进行控制,易于操作.ReentrantLock需要手动加锁解锁并且次数需要一致,不易操作.
2:synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。
3:synchronized是非公平锁,而ReentrantLock可以手动设置是否公平锁
4:synchronized只能关联一个条件队列,ReentrantLock可以关联多个条件队列
3:ReentrantLock的特性
1:可重入性
可以看到 method1加锁后,调用了method2方法,而这个方法也进行了加锁,在有锁的情况下进行二次加锁,运行并没有抛出异常,说明ReentrantLock是可重入的
2:可中断
此代码,主线程先进行获取了锁,然后启动了t1线程,t1线程执行时进行了
interrupt()中断操作.
![](https://i-blog.csdnimg.cn/blog_migrate/2432014eeeba26bb738b485a57f1b7a6.png)
3:可以设置超时时间
可以看到,用了tryLock方法来设置超时时间,本代码等待了1s还没获取到锁就会被返回获取失败
![](https://i-blog.csdnimg.cn/blog_migrate/26f03bafaef5ef5c44dfe8fac4d5894a.png)
4:可以设置为公平锁
可以看到创建ReentrantLock的时候可以在构造函数进行传参.默认是非公平锁, 也可以传true变成公平锁.
![](https://i-blog.csdnimg.cn/blog_migrate/03487757ee2ca4e72826c0ed50f1eb02.png)
5:支持多个条件变量
synchronized 中也有条件变量,ReentrantLock 的条件变量比
synchronized
强大之处在于,它是支持多个条件变量的,这就好比 synchronized 是那些不满足条件的线程都在一间休息室等消息
使用要点:
await
前需要获得锁
await
执行后,会释放锁,进入
conditionObject
等待
await
的线程被唤醒(或打断、或超时)取重新竞争
lock
锁
竞争
lock
锁成功后,从
await
后继续执行
创建条件变量的方法
static Condition waitCigaretteQueue = lock.newCondition();
static Condition waitbreakfastQueue = lock.newCondition();
到这里我们就把ReentrantLock常见的特性介绍了,但是其原理,后续还需要结合 juc下的其他源码来分析。