AQS

浅析AQS

拟墨画扇 提交于 2019-12-01 17:10:17
#前言 好久没写blog了,最近学车,时间真的少了很多,花了一些时间写了一篇AQS,请大家指正。 概述 翻阅AbstractQueuedSynchronizer的源码,会发现如下注释: Pprovides a framework for implementing blocking locks and related synchronizers (semaphores, events, etc) that rely on first-in-first-out (FIFO) wait queues. AbstractQueuedSynchronizer提供一个基于FIFO队列的框架,该框架用于实现阻塞锁和相关同步器(例如:semaphores)。 如此可知,AbstractQueuedSynchronizer可以视为JDK同步器的框架,理解它,有助于理解JDK的同步器。 框架说明 本人依据JDK源码中的注释结合并发经验,总结了如下AQS框架说明: AQS是依赖状态进行同步操作的,其内部使用一个整形变量state,来表示同步状态,此状态值依据具体的同步器语义实现。例如:在CountDownLatch中state即为需要等待的线程数。 AQS的子类必须定义在获取和释放上对应的状态值。对于AQS状态变量的操作必须使用getState,setState,compareAndSetState

Java Concurrency(三)——J.U.C AQS源码解读

こ雲淡風輕ζ 提交于 2019-11-30 01:15:15
java5之后的java.util.concurrent包是世界级并发大师Doug Lea的作品,里面主要实现了 atomic包里Integer/Long对应的原子类,主要基于 CAS ; 一些同步子,包括Lock,CountDownLatch,Semaphore,FutureTask等,这些都是基于AbstractQueuedSynchronizer类; 关于线程执行的Executors类等; 一些并发的集合类,比如ConcurrentHashMap,ConcurrentLinkedQueue,CopyOnWriteArrayList等。 今天我们主要介绍AbstractQueuedSynchronizer这个可以说是最核心的类,没有之一。整个concurrent包里,基本都直接或间接地用到了这个类。Doug Lea的这篇 论文 里面讲AQS的实现。 #AQS 首先,我们来想象一下,一间屋里有一个大家都想要得到的会让你很爽的东西(something which makes you so happy, e.g. W.C)。当有人进去把门关起来在独占享用的时候,其他人就只能在外面排队等待,既然在等待,你就不能老是去敲门说哎,好了没有啊。老是这样的话里面的人就很不爽了,而且你可以利用这点等待时间干点别的,比如看看小说视频背背单词或者就干脆椅子上睡觉,当前面独占的人爽完之后,就会出来说