重入锁的特性, 避免死锁, 如果有锁的话, 不用重新加锁, 直接增加锁的次数..

Synchronize, ReentrantLock都是重入锁.

读写锁, ReentrantReadWriteLock里面有两把锁, 读锁和写锁,适用于读多写少的情景.

读->读会共享

读->写 互斥

写->写 互斥.

AQS:

全称 AbstractQueuedSynchronizer,它 是一个同步工具也是 Lock 用来实现线程同步的核心组件。

AQS 的功能分为两种:独占和共享

I.AQS的state(int类型,32位)

用来描述有多少线程获持有锁。

在独占锁的时代这个值通常是0或者1, 对于可重入锁,一个线程可多次进入,每次进入state+1

在共享锁的时代就是持有锁的数量。

tryAcquire()和tryRelease()其实就是尝试获取状态位state的修改权限并设置独占Thread

waitStatus 状态:

变量waitStatus则表示当前被封装成Node结点的等待状态,共有4种取值CANCELLED、SIGNAL、CONDITION、PROPAGATE。

CANCELLED:值为1,在同步队列中等待的线程等待超时或被中断,需要从同步队列中取消该Node的结点,其结点的waitStatus为CANCELLED,即结束状态,进入该状态后的结点将不会再变化。

SIGNAL:值为-1,被标识为该等待唤醒状态的后继结点,当其前继结点的线程释放了同步锁或被取消,将会通知该后继结点的线程执行。说白了,就是处于唤醒状态,只要前继结点释放锁,就会通知标识为SIGNAL状态的后继结点的线程执行。

CONDITION:值为-2,与Condition相关,该标识的结点处于等待队列中,结点的线程等待在Condition上,当其他线程调用了Condition的signal()方法后,CONDITION状态的结点将从等待队列转移到同步队列中,等待获取同步锁。

PROPAGATE:值为-3,与共享模式相关,在共享模式中,该状态标识结点的线程处于可运行状态。

0状态:值为0,代表初始化状态。

AQS 队列内部维护的是一个 FIFO 的双向链表,这种结构的特点是每个数据结构都有两个指针,分别指向直接的后继节点和直接前驱节点。所以双向链表可以从任 意一个节点开始很方便的访问前驱和后继。每个 Node 其实是由线程封装,当线 程争抢锁失败后会封装成 Node 加入到 ASQ 队列中去;当获取锁的线程释放锁以 后,会从队列中唤醒一个阻塞的节点(线程)。

Condition主要是为了代替Object 监视器方法(wait、notify 和 notifyAll)。Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

Lock提供了比synchronized更加强大、灵活的锁机制,它从某种程度上来说替代了synchronized方式的使用

参考:

java asq_JAVA并发笔记相关推荐

  1. java asq_Java并发:AQS原理

    J·U·C Java并发包 JUC 是java.util.concurrent的简称,在jdk 1.5时被引入,JUC包的主要作者是并发大师Doug Lea,包含了非常多的并发编程工具类,其中有一个叫 ...

  2. Java多线程并发笔记03 synchronized减小锁粒度,优化代码执行时间

    示例代码1:可以对任意Object对象进行加锁 public class ObjectLock {public void method1(){synchronized (this) {//对象锁try ...

  3. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  4. Java高并发编程 (马士兵老师视频)笔记(一)同步器

    本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...

  5. JAVA高并发程序设计(葛一鸣著)读书笔记

    本文为JAVA高并发程序设计(葛一鸣著)读书笔记.这本书对于刚刚入门的童鞋来讲可能有点深,我推荐可以先看看Java多线程编程核心技术(高洪岩著)一书. 第一章 走入并行世界 什么是同步和异步? 同步就 ...

  6. 《实战 Java 高并发程序设计》笔记——第3章 JDK 并发包(二)

    文章目录 3.2 线程复用:线程池 3.2.1 什么是线程池 3.2.2 不要重复发明轮子:JDK 对线程池的支持 1. 固定大小的线程池 2. 计划任务 3.2.3 刨根究底:核心线程池的内部实现 ...

  7. 《实战Java高并发程序设计》github笔记和源码

    笔记 <实战Java高并发程序设计>中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了 笔者做了相关笔记并整理源代码,欢迎 ...

  8. 实战java高并发程序设计-笔记进行中

    <JAVA并发编程实践>:出书时间太早,内容比较散,专业术语翻译较早和现在有差异 <Java并发编程的艺术>:手绘图较多文字内容较少,主要讲解并发实现的底层原理和面临的问题,底 ...

  9. 《亿级流量JAVA高并发与网络编程实战》笔记--------更新中

    <亿级流量JAVA高并发与网络编程实战>笔记 第一章 高并发概述 "高并发技术" 是一个广义的概念,是指一种高效的地实现并发需求的解决方案,是技术领域的名称,可以包含架 ...

最新文章

  1. 利用exchangelib快速上手使用python发邮件
  2. BundleTrack:无需实例或类级别3D模型的6D姿态跟踪算法(IROS2021)
  3. 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
  4. 【项目经验】如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置
  5. python替换img的路径为新的路径_以“五智”为核心 南宁电信打造5G时代数字家庭新路径...
  6. 手把手教你用直方图、饼图和条形图做数据分析(Python代码)
  7. Opencv--copyTo()函数的使用方法
  8. JAVA 正则表达式 RegexUtil
  9. 保姆级教程 CSS 知识点梳理大全,超详细!!!
  10. 自治系统中单个路由表的构造
  11. pycharm查看关键词的方法
  12. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_13_使用字节流读取中文的问题...
  13. [XA]读书感想:个人对敏捷软件开发宣言的理解
  14. 2015年4月工作记录和阅读记录
  15. 教你如何下载微软补丁
  16. CAPL函数 Test Node中注册事件(TestJoin xxx)函数
  17. 【多多情报通】拼多多个人店铺怎么升级为企业店铺?怎么转让?
  18. 如何用MAYA 制作人物动画 使人物动作更加真实流畅
  19. arduino环境下用ESP32连接PS2手柄
  20. 模电与数电的基本知识 (学习备用)

热门文章

  1. 对讲机服务器信号不好怎么办呢,对讲机室内信号不好怎么办?
  2. 贴片轻触开关路线难题
  3. 360安全卫士卸载不了(文件破损-safe文件删除不了)
  4. LDA主题建模过程及参数详解
  5. 电商数据源分析-尚硅谷大数据培训
  6. Mob SDK实现安卓短信验证
  7. 谷歌搜索技巧:搜索语法 隐藏彩蛋 高级设置
  8. B.背单词 。。 KMP。模板题
  9. 邮件客户端软件常见故障
  10. Eclipse中提示svn: is already locked的解决办法