Java并发同步器AQS(AbstractQueuedSynchronizer)学习笔记(1)

旧街凉风 提交于 2019-11-27 10:34:52
Java中的并发包,是在Java代码中并发程序的热门话题。如果我们去读concurrent包的源码时,会发现其真正的核心是 AbstractQueuedSynchronizer , 简称 AQS 框架 , 而 Doug Lea 大神正是此包的作者。 之前也看过一遍 AbstractQueuedSynchronize,但印象不深,只有依稀的印象。这次重新学习一遍,并整理出笔记,希望对自己或者是别人有用。当然了,笔者也是浅显的过一遍,很多细节也并不是完全理解。 建议读者先看这个系列的文章:Inside AbstractQueuedSynchronizer,之后再继续本篇。 首先,AQS会对进行 acquire 而被阻塞的线程进行管理,说是管理,其实就是内部维护了一个FIFO队列,这个队列是一个双向链表。链头可以理解为是一个空的节点,除了链头以外,每个节点内部都持有着一个线程,同时,有着两个重要的字段:waitStatus 和 nextWaiter。nextWaiter一般是作用与在使用Condition时的队列。而waitStatus则有以下几个字段: SIGNAL 表示下一个节点应该被唤醒。为什么是下一个节点?因为刚刚说了,这个FIFO队列,链头都是一个空的节点,但此节点的 waitStatus 正好就表示了要对下一节点做的事情 CANCELLED 表示此节点持有的线程被中断

读书笔记之《Java并发编程的艺术》-java中的锁

99封情书 提交于 2019-11-27 09:23:27
读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360.jdk.concurrent 本书前三章分别为 并发编程的挑战,也就是并发编程的缘由所在 底层的实现原理 java内存模型 分别从cpu x86,x64以及内存模型等概念中描述java对并发编程的实现和控制,概念较为底层和基础,读书笔记略过前三章直接从第四章应用实现及原理基础开始。 章节 并发编程基础 java中的锁 并发容器和框架(重点) 13个操作原子类 java并发工具类 线程池 Execurot框架 内容 java中的锁 Lock接口 Lock接口出现之前,java是通过synchronized关键字实现的锁功能,javase5之后,并发包新增了Lock接口 Lock使用方式,和分布式锁的构造很像。 Lock lock = new ReentrantLock lock.lock(); try{ }finally{ lock.unlock(); } Lock接口提供了Synchronized关键字不具备的特性 尝试非阻塞地获取锁 当前线程尝试获取锁,没有其他线程获取锁,则成功 能被中断的获取锁 超时获取锁