写在前面 在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础.AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态,对于子类而言它并没有太多的活要做,AQS提供了大量的模板方法来实现同步,主要是分为三类:独占式获取和释放同步状态.共享式获取和释放同步状态.查询同步队列中的等待线程情况.自定义子类使用AQS提供的模板方法就可以实现自己的同步语义. 独占式 独占式,同一时刻仅有一个线程持有同步状态. 独占式同步状态获取 ac…
此篇博客所有源码均来自JDK 1.8 在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础.AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态,对于子类而言它并没有太多的活要做,AQS提供了大量的模板方法来实现同步,主要是分为三类:独占式获取和释放同步状态.共享式获取和释放同步状态.查询同步队列中的等待线程情况.自定义子类使用AQS提供的模板方法就可以实现自己的同步语义. 独占式 独占式,同一时刻仅有一个线程持有同步状态…
目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQueued(Node, int) 出队void setHead(Node) boolean shouldParkAfterFailedAcquire(Node,Node) boolean parkAndCheckInterrupt() void cancelAcquire(node) 释放资源 bool…
首先我们从java.util.concurrent.locks包中的AbstraceQueuedSynchronizer说起,在下文中称为AQS. AQS是一个用于构建锁和同步器的框架.例如在并发包中的ReentrantLock.Semaphore.CountDownLatch.ReentrantReadWriteLock等都是基于AOS构建,这些锁都有一个特点,都不是直接扩展自AQS,而是都有一个内部类继承自AQS.为什么会这么设计而不是直接继承呢?简而言之,锁面向的是使用者,同步器面向的是线…
在上节中解析了AbstractQueuedSynchronizer(AQS)中独占模式对同步状态获取和释放的实现过程.本节将会对共享模式的同步状态获取和释放过程做一个解析.上一节提到了独占模式和共享模式的区别,最主要的区别就是在同一时刻能否有多个线程同时获取到同步状态. 1).共享模式同步状态的获取 这个方法同独占模式获取同步状态的acquire方法一样,同样也是一个模板方法,我们简要回顾一下独占模式下获取同步状态的acquire方法: //AbstractQueuedSynchronizer#…
写在前面 Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断.超时获取锁,且它为独占式在高并发场景下性能大打折扣. 在介绍Lock之前,我们需要先熟悉一个非常重要的组件,掌握了该组件JUC包下面很多问题都…
写在前面 重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少.然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低.所以就提供了读写锁. 读写锁维护着一对锁,一个读锁和一个写锁.通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访问,但是在写线程访问时,所有读线程和写线程都会被阻塞. 读写锁的主要特性: 公平性:支持公平性和非…
前言 最近结合书籍<Java并发编程艺术>一直在看AQS的源码,发现AQS核心就是:利用内置的FIFO双向队列结构来实现线程排队获取int变量的同步状态,以此奠定了很多并发包中大部分实现基础,比如ReentranLock等.今天又是周末,便来总结下最近看的消化后的内容. 主要参考资料<Java并发编程艺术>(有需要的小伙伴可以找我,我这里只有电子PDF)结合ReentranLock.AQS等源码. 博文中的流程图,结构图等都是我理解之后一步步亲自画的,如果转载,请标明谢谢! 一.同…
一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, AQS是一个用于构建锁和同步容器的框架.事实上concurrent包内许多类都是基于AQS构建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等.AQS解决了在实现同步容器时设计的大量细节问题.这些锁…
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和…