并发编程:java中的锁ReentrantLock的理解

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()中断操作.

 

3:可以设置超时时间
可以看到,用了tryLock方法来设置超时时间,本代码等待了1s还没获取到锁就会被返回获取失败

 

4:可以设置为公平锁
可以看到创建ReentrantLock的时候可以在构造函数进行传参.默认是非公平锁, 也可以传true变成公平锁.

 

5:支持多个条件变量
synchronized 中也有条件变量,ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的,这就好比 synchronized 是那些不满足条件的线程都在一间休息室等消息
使用要点:
await 前需要获得锁
await 执行后,会释放锁,进入 conditionObject 等待
await 的线程被唤醒(或打断、或超时)取重新竞争 lock
竞争 lock 锁成功后,从 await 后继续执行

创建条件变量的方法

static Condition waitCigaretteQueue = lock.newCondition();
static Condition waitbreakfastQueue = lock.newCondition();
到这里我们就把ReentrantLock常见的特性介绍了,但是其原理,后续还需要结合 juc下的其他源码来分析。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值