Lock的基本使用及原理笔记
java.util.concurrent 并发工具包
Lock
Lock是个接口,ReentrantLock唯一实现Lock的类
synchronized和ReentrantLock都支持重入锁
当多个线程争抢锁,其他的会阻塞
AQS同步工具
1、独占->互斥
2、共享->读写锁
AQS的基本实现
1、一个共享数据类记录锁的状态(有锁/无锁)
state:锁标记,0是无锁、大于0是有锁和重入次数,通过cas实现原子性(乐观锁)
Node节点信息
static final class Node {static final Node SHARED = new Node();static final Node EXCLUSIVE = null;static final int CANCELLED = 1;static final int SIGNAL = -1;static final int CONDITION = -2;static final int PROPAGATE = -3;volatile int waitStatus;volatile Node prev;volatile Node next;volatile Thread thread;Node nextWaiter;final boolean isShared() {return nextWaiter == SHARED;}final Node predecessor() throws NullPointerException {Node p = prev;if (p == null)throw new NullPointerException();elsereturn p;}Node() { // Used to establish initial head or SHARED marker}Node(Thread thread, Node mode) { // Used by addWaiterthis.nextWaiter = mode;this.thread = thread;}Node(Thread thread, int waitStatus) { // Used by Conditionthis.waitStatus = waitStatus;this.thread = thread;}}
a、b、c线程执行lock()争抢锁流程(AQS)
1、a先执行lock.lock()获取到锁后获取到了,执行业务代码
2、b在执行lock.lock()没有抢到锁时会被包装成Node节点加入AQS队列并挂起,每个Node节点中会有一个pre指向上一个被挂起的Node和一个next指向下一个进来被挂起的Node,AQS队列中第一个Node节点中thread指向为空,表示获得所的线程,第二个Node才是线程b
3、c接着执行lock.lock()也没有抢到锁,然后被包装成Node,c的Node的pre会指向b的Node,b的Node的next会指向c的Node,这样多个Node就组成了一个双向链表
4、当a走完业务代码执行lock.unlock()释放了锁后,会移除第一个Node节点并唤起AQS队列中第二个Node也就是b并继续执行业务代码
lock.Condition
a、b线程执行lock()争抢锁,a在释放锁钱执行condition.await流程(AQS)
1、2同上
3、当a走业务代码执行condition.await后,会释放当前的锁并清空重入次数,然后被阻塞并加入到condition队列中,然后会移除第一个Node节点并唤起AQS队列中第二个Node也就是b并继续执行业务代码
4、b执行lock.lock抢到锁后执行完业务并执行condition.signal(),就会把condition队列中的第一个Node也就是A加入到AQS队列中去等待被唤醒重新争抢锁
CountDownLatch/CycliBarrier
Semaphore 限流
阻塞队列
通过ReencurrentLock和condition实现
ArrayBlockQueue
LinkBlockQueue
DelayQueue
SynchrousQueue
Atomic原子操作的原理
通过一个do-while循环不断去查询再CAS操作直到成功才退出循环
Lock的基本使用及原理笔记相关推荐
- 集群概述及原理笔记(1)
it你好linux学习文档之集群概述及原理笔记(1) 一 前言 目前,越来越多的网站采用Linux操作系统,提供邮件.Web.文件存储.数据库等服务.也有非常多的公司在企业内部网中利用Linux服务器 ...
- 人工智能原理笔记------知识表示方法
人工智能原理笔记------知识表示方法 知识表示 知识表示方法 非结构化方法 谓词逻辑表示法 命题 真值 论域(个体域) 谓词 函数 谓词逻辑组成 连接词 约束量词 谓词公式 谓词逻辑表示步骤 产生 ...
- 编译原理笔记(二)之词法分析
编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...
- zucc 编译原理 笔记
zucc 编译原理 笔记 lec02 lec03 lec04
- 【微机原理笔记】第 1 章 - 微型计算机基础概论
微机原理笔记 - 主页 第 1 章 微型计算机基础概论 1. 微型计算机系统 (1)微型控制机是嵌入计算机的一种 8 位或 16 位机,没有操作系统. (2)计算机的基本组成( 3+1 结构):CPU ...
- 自考计算机网络原理笔记,自考计算机网络原理笔记(典藏版).pdf
更多优质自考资料尽在百度贴吧自考乐园俱乐部 (/club/5346389)欢迎❤加入...欢迎❤交流...止不住的惊喜等着你 2010 2010 考计算机网络原理笔记(典藏版) 网络发展阶段: 网络发 ...
- 雷达原理笔记之恒虚警概率检测
雷达原理笔记--恒虚警概率检测 --南京理工大学许志勇老师的<雷达原理课程>浅析 恒虚警概率检测技术是雷达设计过程中经常涉及到的问题. 由于噪声的存在,雷达在探测目标时不可避免地会出现虚警 ...
- 计算机网络原理笔记 精整理 第六章 应用层
计算机网络原理笔记 精整理 第六章 应用层 6.1域名系统DNS 6.1.1什么是域名 6.1.2域名的结构 6.1.3Internet中的域名服务器 6.1.4域名解析过程 6.2动态主机配置协议D ...
- 经济学原理笔记-微观CP11-公共物品和公共资源
经济学原理笔记-微观CP11-公共物品和公共资源 1.谈谈四种类型的物品 2.为什么公共物品要由政府来提供? 3.基础研究也是公共物品? 4.为什么有效率地提供公共物品比有效率地提供私人物品更困难? ...
最新文章
- 内存、性能问题分析的利器——valgraind
- python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞
- 当前记录集不支持更新_微信现已正式支持修改微信号!微信7.0.16内测版更新(附下载)...
- java 类无法实例_Java无法从类实例访问类方法
- BeetleX之vue-autoui自匹配UI插件
- 树莓派该文件名_树莓派:文本编辑器与文件
- java编程思想(注释文档)
- 英特尔固态硬盘测试软件,Intel SSD Toolbox
- 祝贺MindV进入香港国际软件大奖赛100强
- U盘中毒文件被隐藏?U盘中毒了怎么恢复文件
- 比风水厉害100倍的宇宙规律,你懂多少?
- 嵌入式软硬件模块化开发和工具性总结
- InterValue正式启动主网映射
- 合成共轭莫比乌斯索烃研究取得进展
- 系统封装Windows XP sp3专业版
- SAAS的概念及优缺点
- MySQL索引key_len
- node中的cd命令,cd命令
- Unable to negotiate with x.x.x.x port 22: no matching key exchange method found. Their offer: diffie
- php跨域解决办法,PHP跨域问题解决方案
热门文章
- 晶圆代工是什么?图解晶圆代工流程!
- JRebel热部署的使用
- 学习笔记-回溯算法(八皇后问题)暴力法
- sql注入中的order by
- linux命令调ftp限速,Linux下操作设置ftp普通账号和vip账号限速
- 【python】实验题
- train_dataset = train_dataset.batch(200)中的batch是什么意思
- 无人机航拍的技巧你知道吗?VR全景航拍应用在哪里?
- 2020年T电梯修理考试总结及T电梯修理试题及答案
- 谣言检测文献阅读一A Review on Rumour Prediction and Veracity Assessment in Online Social Network