概述
Java 的jdk级别的锁主要是在JUC包下,包括atomic包下的乐观锁和locks包下的悲观锁。今天来介绍一下locks包下的悲观锁(由于百家号对markdown支持不好,代码只能以图片的方式展示了)
ReentrantLock
ReentrantLock实现了Lock接口,是可重入锁,它是支持公平锁和非公平锁的。下面从加锁和解锁的过程分析一下ReentrantLock。
1、加锁lock()
lock操作是分为公平和非公平两种方式的,公平锁顾名思义就是先到先得,先到的线程先拿到锁,后到的线程需要排队,等到前面的线程释放锁之后才能拿到锁,这种方式的缺点是吞吐量小,因为在等待CPU的调度是需要耗费时间的;非公平锁是先去尝试获取锁,如果拿到锁就成功了,如果拿不到再去排队获取锁,这种方式相比公平锁而言,就少了唤醒排队锁时所需要的时间,吞吐量会比公平锁高。
ReentrantLock和AQS使用了模板设计模式,固定的处理方法都在AQS抽象类中
非公平锁的lock
公平锁的lock
对于公平锁和非公平锁都用到的方法,都是在AQS中,如下:
addWaiter方法构造一个Node放到队尾
2、解锁unlock()
unlock方法调用了AQS的release方法
在ReentrantLock中重写了tryRelease方法,主要操作就是把state值减一
tryRelease成功之后,就要去唤醒它的继任者,unparkSuccessor同样是在AQS中实现
3、使用
在源码中,也给出了简单的使用例子,但是我觉得在jdk源码中的类LinkedBlockingQueue使用ReentrantLock还是比较适合参照的,下面以代码的形式展示ReentrantLock的使用方式
ReentrantLock就介绍到这了,明天继续更文Lock相关知识
最后
以上就是虚心钢笔为你收集整理的java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)的全部内容,希望文章能够帮你解决java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复