重入锁-ReentrantLock
ReentrantLock
- 一.重入锁的特点
- 1)实现重进入功能
- 2)分为公平锁和非公平锁:
- 二.ReentrantLock和AQS的关系
一.重入锁的特点
1)实现重进入功能
重进入是指任意线程获取锁之后能够再次获取该锁而不会被锁阻塞
锁的获取和释放过程如下:
- 线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是则再次获取成功。
- 锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数器等于0时表示锁已经成功释放了。
2)分为公平锁和非公平锁:
公平锁:
- 对先发起请求的线程即等待最久的线程优先满足,获取锁是顺序的,符合FIFO原则,不会产生线程饥饿;
- 获取锁调用tryAcquire方法,与非公平锁不一样的地方在于判断条件多了hasQueuedPredecessors()方法,这个方法判断队列中是否有其他节点,如果队列中还有其他节点,但是head后面还没关联节点 / 或者队列中head节点的后继节点关联的线程不是当前线程,如果是返回true,则表示有线程比当前线程更早地请求获取锁,因为要等待前驱节点获取并释放锁后才嫩继续获取到锁。
非公平锁(默认的):
- 获取是使用nonfairTryAcquire方法,只要CAS设置同步状态成功,则当前线程获取了锁。
- 非公平锁比公平锁效率更高,因为公平锁为了保证公平性会去切换线程导致上下文切换,存在额外的开销,所以非公平锁性能更好(所以作为默认的实现方式),保证了更大的吞吐量,但是可能会产生线程饥饿。
二.ReentrantLock和AQS的关系
锁底层大多方法是使用AQS来实现的。
一般我们使用ReentrantLock都是直接创建一个对象,例如下面代码
Lock lock = new ReentrantLock();
下面我们看下ReentrantLock的构造函数
public ReentrantLock() {//默认实现是以非公平锁实现的sync = new NonfairSync();}
从上面这个代码可以看出,我们要分析两个东西:一个是sync,一个是NofairSync(非公平锁):
//ReentrantLock实现了Lock
public class ReentrantLock implements Lock, java.io.Serializable {//我们刚刚要找的sync字段private final Sync sync;//Sync继承了AbstractQueuedSynchronizerabstract static class Sync extends AbstractQueuedSynchronizer {
1.sync分析:从上面源码可以看出sync是ReentrantLock内的属性,而且Sync是ReentrantLock的内部类,并且继承了AbstractQueuedSynchronizer,这个就是我们常常说的AQS,再进入AQS类看下:
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizerimplements java.io.Serializable {
从上面源码可以看出AbstractQueuedSynchronizer继承AbstractOwnableSynchronizer,也就是AQS继承AOS(后面都用AQS代表AbstractQueuedSynchronizer,AOS代表AbstractOwnableSynchronizer),我们再看看还没分析的NofairSync;
public class ReentrantLock implements Lock, java.io.Serializable {//NonfairSync继承Syncstatic final class NonfairSync extends Sync {
2.NofairSync分析:从上面源码可以看出NonfairSync也是ReentrantLock的内部类,并且继承Sync,难怪刚刚new NonfairSync()可以直接赋值给sync我们再看下ReentrantLock类的结构:
到这里我们可以总结下:
1.ReentrantLock下面有三个内部类:Sync,NonfairSync,FairSync
2.AQS继承AOS
2.Sync继承AQS
3.NonfairSync(非公平锁)、FairSync(公平锁)分别继承Sync
那我们可以得出UML图
AQS和ReentrantLock参考源码分析:
https://guguoyu.blog.csdn.net/article/details/90485326
重入锁-ReentrantLock相关推荐
- 并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
文章目录 J.U.C脑图 ReentrantLock概述 ReentrantLock 常用方法 synchronized 和 ReentrantLock的比较 ReentrantLock示例 读写锁R ...
- Java 重入锁 ReentrantLock 原理分析
1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...
- java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理
前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...
- java多线程---重入锁ReentrantLock
1.定义 重入锁ReentrantLock,支持重入的锁,表示一个线程对资源的重复加锁. 2.底层实现 每个锁关联一个线程持有者和计数器,当计数器为0时表示该锁没有被任何线程持有,那么任何线程都可能获 ...
- 重入锁ReentrantLock详解
重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁的还支持获取锁时的公平和非公平性选择. 在AQS实现中,当一个线程调用Mute ...
- Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...
- java lock可重入_Java源码解析之可重入锁ReentrantLock
本文基于jdk1.8进行分析. ReentrantLock是一个可重入锁,在ConcurrentHashMap中使用了ReentrantLock. 首先看一下源码中对ReentrantLock的介绍. ...
- Java多线程——重入锁ReentrantLock源码阅读
上一章<AQS源码阅读>讲了AQS框架,这次讲讲它的应用类(注意不是子类实现,待会细讲). ReentrantLock,顾名思义重入锁,但什么是重入,这个锁到底是怎样的,我们来看看类的注解 ...
- Java 并发编程之可重入锁 ReentrantLock
Java 提供了另外一个可重入锁,ReentrantLock,位于 java.util.concurrent.locks 包下,可以替代 synchronized,并且提供了比 synchronize ...
- JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理
synchronized的用法和实现原理 synchronized实现线程同步的用法和实现原理 不足 synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不 ...
最新文章
- oracle 新增自增字段,SQL server、Oracle中拿到新增列时的自增字段值
- 如何大写字符串中每个单词的第一个字符
- 同一个ip能否两次加入组播_组播IGMPv1/v2/v3精华知识汇总
- AMD CEO苏姿丰称芯片短缺还将持续 今年相当紧缺
- DataTable增加行
- 2016年PMP项目管理知识体系精髓总结
- visio设置网络拓扑图
- 推荐的开源 PHP CMS 系统
- 【计算机网络】计算机网络基础知识笔记
- 音频,视频合并软件——ffmpeg下载及使用
- 最新谷歌GOOGLE搜索命令大全
- 17行python代码轻松搞定堆糖网所有小姐姐图片
- Raid4校验盘之殇
- Win10 没有激活,如何改变任务栏位置
- python用scrapy爬取58同城的租房信息
- jdbc连接mysql数据库,设置字符集编码
- 7-43 查询水果价格
- 计算机系学不学工程力学,工程力学专业属于什么门类
- 好用又免费的办公软件
- 弘辽科技:淘宝怎么改发货时间?有什么发货规则?