java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)

Java 的jdk级别的锁主要是在JUC包下,包括atomic包下的乐观锁和locks包下的悲观锁。今天来介绍一下locks包下的悲观锁(由于百家号对markdown支持不好,代码只能以图片的方式展示了)

ReentrantLock

ReentrantLock实现了Lock接口,是可重入锁,它是支持公平锁和非公平锁的。下面从加锁和解锁的过程分析一下ReentrantLock。

1、加锁lock()

lock操作是分为公平和非公平两种方式的,公平锁顾名思义就是先到先得,先到的线程先拿到锁,后到的线程需要排队,等到前面的线程释放锁之后才能拿到锁,这种方式的缺点是吞吐量小,因为在等待CPU的调度是需要耗费时间的;非公平锁是先去尝试获取锁,如果拿到锁就成功了,如果拿不到再去排队获取锁,这种方式相比公平锁而言,就少了唤醒排队锁时所需要的时间,吞吐量会比公平锁高。

ReentrantLock和AQS使用了模板设计模式,固定的处理方法都在AQS抽象类中

非公平锁的lock

8dc96ab7e3586ddcbfcc5693feee57cf.png

公平锁的lock

8e188a08c3bec5098771bbd278883f0b.png

对于公平锁和非公平锁都用到的方法,都是在AQS中,如下:

3df7c73237881bb55bc838b9b7d72334.pngaddWaiter方法构造一个Node放到队尾

7dd049a044f5fd9d5acf57fe0c1d1aee.png

68743ac886af23824de7cb985d13f729.png

2、解锁unlock()

unlock方法调用了AQS的release方法

11f875460c1619eda642f7441ad9bd34.png

在ReentrantLock中重写了tryRelease方法,主要操作就是把state值减一

63c6f9623858d044bffddd30b18fe2c5.png

tryRelease成功之后,就要去唤醒它的继任者,unparkSuccessor同样是在AQS中实现

566fba209700aff95bb075d70d159b95.png

3、使用

在源码中,也给出了简单的使用例子,但是我觉得在jdk源码中的类LinkedBlockingQueue使用ReentrantLock还是比较适合参照的,下面以代码的形式展示ReentrantLock的使用方式

cbd94734319e9a1e102a017f529405a2.png

ReentrantLock就介绍到这了,明天继续更文Lock相关知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值