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. 集群概述及原理笔记(1)

    it你好linux学习文档之集群概述及原理笔记(1) 一 前言 目前,越来越多的网站采用Linux操作系统,提供邮件.Web.文件存储.数据库等服务.也有非常多的公司在企业内部网中利用Linux服务器 ...

  2. 人工智能原理笔记------知识表示方法

    人工智能原理笔记------知识表示方法 知识表示 知识表示方法 非结构化方法 谓词逻辑表示法 命题 真值 论域(个体域) 谓词 函数 谓词逻辑组成 连接词 约束量词 谓词公式 谓词逻辑表示步骤 产生 ...

  3. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

  4. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  5. 【微机原理笔记】第 1 章 - 微型计算机基础概论

    微机原理笔记 - 主页 第 1 章 微型计算机基础概论 1. 微型计算机系统 (1)微型控制机是嵌入计算机的一种 8 位或 16 位机,没有操作系统. (2)计算机的基本组成( 3+1 结构):CPU ...

  6. 自考计算机网络原理笔记,自考计算机网络原理笔记(典藏版).pdf

    更多优质自考资料尽在百度贴吧自考乐园俱乐部 (/club/5346389)欢迎❤加入...欢迎❤交流...止不住的惊喜等着你 2010 2010 考计算机网络原理笔记(典藏版) 网络发展阶段: 网络发 ...

  7. 雷达原理笔记之恒虚警概率检测

    雷达原理笔记--恒虚警概率检测 --南京理工大学许志勇老师的<雷达原理课程>浅析 恒虚警概率检测技术是雷达设计过程中经常涉及到的问题. 由于噪声的存在,雷达在探测目标时不可避免地会出现虚警 ...

  8. 计算机网络原理笔记 精整理 第六章 应用层

    计算机网络原理笔记 精整理 第六章 应用层 6.1域名系统DNS 6.1.1什么是域名 6.1.2域名的结构 6.1.3Internet中的域名服务器 6.1.4域名解析过程 6.2动态主机配置协议D ...

  9. 经济学原理笔记-微观CP11-公共物品和公共资源

    经济学原理笔记-微观CP11-公共物品和公共资源 1.谈谈四种类型的物品 2.为什么公共物品要由政府来提供? 3.基础研究也是公共物品? 4.为什么有效率地提供公共物品比有效率地提供私人物品更困难? ...

最新文章

  1. 内存、性能问题分析的利器——valgraind
  2. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞
  3. 当前记录集不支持更新_微信现已正式支持修改微信号!微信7.0.16内测版更新(附下载)...
  4. java 类无法实例_Java无法从类实例访问类方法
  5. BeetleX之vue-autoui自匹配UI插件
  6. 树莓派该文件名_树莓派:文本编辑器与文件
  7. java编程思想(注释文档)
  8. 英特尔固态硬盘测试软件,Intel SSD Toolbox
  9. 祝贺MindV进入香港国际软件大奖赛100强
  10. U盘中毒文件被隐藏?U盘中毒了怎么恢复文件
  11. 比风水厉害100倍的宇宙规律,你懂多少?
  12. 嵌入式软硬件模块化开发和工具性总结
  13. InterValue正式启动主网映射
  14. 合成共轭莫比乌斯索烃研究取得进展
  15. 系统封装Windows XP sp3专业版
  16. SAAS的概念及优缺点
  17. MySQL索引key_len
  18. node中的cd命令,cd命令
  19. Unable to negotiate with x.x.x.x port 22: no matching key exchange method found. Their offer: diffie
  20. php跨域解决办法,PHP跨域问题解决方案

热门文章

  1. 晶圆代工是什么?图解晶圆代工流程!
  2. JRebel热部署的使用
  3. 学习笔记-回溯算法(八皇后问题)暴力法
  4. sql注入中的order by
  5. linux命令调ftp限速,Linux下操作设置ftp普通账号和vip账号限速
  6. 【python】实验题
  7. train_dataset = train_dataset.batch(200)中的batch是什么意思
  8. 无人机航拍的技巧你知道吗?VR全景航拍应用在哪里?
  9. 2020年T电梯修理考试总结及T电梯修理试题及答案
  10. 谣言检测文献阅读一A Review on Rumour Prediction and Veracity Assessment in Online Social Network