我是靠谱客的博主 虚心钢笔,最近开发中收集的这篇文章主要介绍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相关知识

最后

以上就是虚心钢笔为你收集整理的java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)的全部内容,希望文章能够帮你解决java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部