AQS(AbstractQueuedSynchronizer)】的更多相关文章

除了内置锁(synchronized)外,java AQS(AbstractQueuedSynchronizer)同步器几乎是所有同步容器,同步工具类的基础.ReentrantLock.ReentrantReadWriteLock就是通过内部类继承并实现AQS的接口来实现相关功能的. 查看AQS的源码,包含以下几个内容: Node数据结构定义,用于存放被阻塞(自旋或者挂起)的线程信息,或者存放等待condition的线程,通过标记区别,共用统一数据结构 node队列通用操作,包括队列操作和rel…
前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关键字并不需要去关心锁的获取和释放过程,但是在提供方便的同时也意味着其灵活性的下降.例如,有这样的一个场景,先获取锁 A,然后再获取锁 B,当锁 B 获取到之后,释放锁 A 同时获取锁 C,当获取锁 C 后,再释放锁 B 同时获取锁 D,依次类推,像这种比较复杂的场景,使用 synchronized…
AbstractQueuedSynchronizer 是一个锁框架.实现的原理(大概): 1.关于重入锁方面的实现,参考(手写一个可重入锁). 2.关于公平锁方面的实现,使用双链表的形式,进行公平锁的排队. 怎么用: 详见AbstractQueuedSynchronizer的api,或者参考:ReentrantLock的实现. 源码解析: 待补充....…
上一页介绍AQS其基本设计思路以及两个内部类Node和ConditionObject实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇说一说AQS的主要方法的实现.AQS和CLHLock的最大差别是,CLHLock是自旋锁,而AQS使用Unsafe的park操作让线程进入等待(堵塞). 线程增加同步队列,和CLHLock一样,从队尾入队列,使用CAS+轮询的方式实现无锁化. 入队列后设置节点的prev和next引用,形成双向链表的结构…
1.AQS是什么 AQS同步器是Java并发编程的基础,从资源共享的角度分成独占和共享两种模式,像ReentrantLock.ThreadPoolExecutor.CountDownLatch等都是基于AQS来实现的,如图: 2.AQS同步队列的基本结构 AQS维护了一个头节点(head)和一个尾节点(tail)结构的双向链表,当一个线程获取锁失败时,会将该线程打包成一个Node节点,挂到同步队列尾节点 private transient volatile Node head;//同步队列头结点…
1.简述 锁时用来控制多个线程访问共享资源的方式,一般情况下,一个锁能够防止多个线程同时访问共享资源.但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁. 在Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有 synchronized 和 volatile.Java 5.0 增加了一种的新的机制:ReentrantLock.ReentrantLock并不是一种替代内置加锁的方法,而是当内置锁机制不适用时,作为一种可选择的高级功能.相比内置锁,它更具有一定的灵活性,本文将一步步…
提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一些问题:当我们通过实例化一个ReentrantLock并且调用它的lock或unlock的时候,这其中发生了什么?如果多个线程同时对同一个锁实例进行lock或unlcok操作,这其中又发生了什么? 什么是可重入锁? ReentrantLock是可重入锁,什么是可重入锁呢?可重入锁就是当前持有该锁的线…
前言 JDK1.5 之后发布了JUC(java.util.concurrent),用于解决多线程并发问题.AQS 是一个特别重要的同步框架,很多同步类都借助于 AQS 实现了对线程同步状态的管理. AQS 中最主要的就是独占锁和共享锁的获取和释放,以及提供了一些可中断的获取锁,超时等待锁等方法. ReentranLock 是基于 AQS 独占锁的一个实现.ReentrantReadWriteLock 是基于 AQS 共享锁的一个读写锁实现.本来打算一篇文章里面写完独占锁和共享锁,但是发现篇幅太长…
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现.既然它这么优秀,是骡子是马,就拉出来溜溜吧. 首先用重入锁来实现简单的累加,就像这样: /** * 用重入锁实现累加 * * @author 湘王 */ public class MyLockTest { private final Lock lock = new ReentrantLock(); private int value; public int getNext() {…
在上一篇博客,简单的说下了AQS的基本概念,核心源码解析,但是还有一部分内容没有涉及到,就是AQS对条件变量的支持,这篇博客将着重介绍这方面的内容. 条件变量 基本应用 我们先通过模拟一个消费者/生产者模型来看下条件变量的基本应用: 当有数据的时候,生产者停止生产数据,通知消费者消费数据: 当没有数据的时候,消费者停止消费数据,通知生产者生产数据: public class CommonResource { private boolean isHaveData = false; Lock loc…
在一篇博客中,我们看了下CopyOnWriteArrayList的源码,不是很难,里面用到了一个可重入的排他锁: ReentrantLock,这东西看上去和Synchronized差不多,但是和Synchronized是完全不同的东西. Synchronized锁的特性是JVM保证的,ReentrantLock锁的特性是上层的Java代码控制的.而ReentrantLock的基础就是AQS,事实上,很多并发容器都用了ReentrantLock,也就间接的用到了AQS,还有并发框架,如CountD…
近期总体过了下AQS的结构.也在网上看了一些讲AQS的文章,大部分的文章都是泛泛而谈.又一次看了下AQS的代码,把一些新的要点拿出来说一说. AQS是一个管程.提供了一个主要的同步器的能力,包括了一个状态,改动状态的原子操作.以及同步线程的一系列操作.它是CLHLock的变种,CLHLock是一个基于队列锁的自旋锁算法. AQS也採用了队列来作为同步线程的结构.它维护了两个队列.一个是作为线程同步的同步队列,还有一个是基于Unsafe来进行堵塞/唤醒操作的条件队列. 所以理解队列操作是理解AQS…
一.AQS介绍 AQS(AbstractQueuedSynchronizer)抽象队列同步器,属于多线程编程的基本工具:JDK对其定义得很详细,并提供了多种常用的工具类(重入锁,读写锁,信号量,CyclicBarrier,CountDownLatch),在阅读源码的时候,我是从具体工具类往上读的,这样会比较便于理解AQS的设计. 下面,我将从五种常用类去分析源码,进而学习AQS. 论文地址 二.开始吧,重入锁(ReetrantLock) 我们要阅读的重入锁,它首先遵循Lock的规范,并且实现了序…
最近,在看一些java高级面试题,我发现我在认真研究一个面试题的时候,我自己的收获是很大的,我们在看看面试题的时候,不仅仅要看这个问题本身,还要看这个问题的衍生问题,一个问题有些时候可能是一个问题群(如果只关注问题本身,可以跳过补充部分). 这个是我一个多星期的奋战结果,把它记录下来,如有不当,希望大家不吝赐教. java 线程池的实现原理,threadpoolexecutor关键参数解释 原理见下图 (或者:https://blog.csdn.net/u013332124/article/de…
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) AQS在Worker中的应用——标识空闲or非空闲工作线程 我对这个上锁一直搞不懂,虽然有注释说是允许中断啥的,但是还是一头雾水,就打算直接看代码分析.第一眼看到这个lock的时候,我就吓到了. 产生了第一个问题:"啥,一上锁,多个线程不是就要同步排队了嘛? 而且也没这必要啊! " 看清楚了才知道,…
写在前面 ReentrantLock,可重入锁,是一种递归无阻塞的同步机制.它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大.灵活的锁机制,可以减少死锁发生的概率. API介绍如下: 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大.ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有.当锁定没有被另一个线程所…
转载自 美团技术团队,原文链接 不可不说的Java“锁”事 前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识.下面给出本文内容的总体分类目录: 1. 乐观锁 VS 悲观锁 乐观…
分布式协调技术Zookeeper 2.1 zookeeper集群安装部署(略) 2.2 zookeeper的基本原理,数据模型 2.3 zookeeper Java api的使用 2.4 zookeeper实际应用场景分析及实战 2.5 zookeeper+dubbo的实战练习(略) zookeeper的基本原理,数据模型: dubbo的服务注册中心就是基于zookeeper.zookeeper是一种分布式协调服务(可以在分布式系统中共享配置,协调锁资源,提供命名服务). zookeeper的目…
javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识.下面给出本文内容的总体分类目录: 一.java中的锁 什么是锁 在计算机科学中,锁(lock)与互斥(mutex)是一种…
前言 上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadWriteLock.(若是遇到之前讲过的方法,将不再赘述) 先思考一下,为什么我们用读写锁分离? 我们知道 ReentrantLock 用的是独占锁,不管线程是读还是写状态,都会阻塞,这无疑会降低并发量. 但是,我们知道多个线程同时去读数据的时候,并不会产生线程安全的问题,因为它们互不干扰.那么为什么…
1. MyAQS介绍    在这个系列博客中,我们会参考着jdk的AbstractQueuedLongSynchronizer,从零开始自己动手实现一个AQS(MyAQS).通过模仿,自己造轮子来学习主要有两个好处,一是可以从简单到复杂,从核心逻辑再到旁路逻辑的实现,学习曲线较为平滑:二是可以站在设计者的角度去思考实现具体功能时可以采用的各种方案的优劣,更深刻的理解其设计的精妙.关键之处. AQS支持互斥和共享这两种工作模式,其中互斥模式比共享模式要简单许多.本着由浅入深的原则,本篇博客实现的M…
前几篇分析了一下AQS的原理和实现.这篇拿Semaphore信号量做样例看看AQS实际是怎样使用的. Semaphore表示了一种能够同一时候有多个线程进入临界区的同步器,它维护了一个状态表示可用的票据,仅仅有拿到了票据的线程尽能够进入临界区,否则就等待.直到获得释放出的票据. Semaphore经常使用在资源池中来管理资源.当状态仅仅有1个0两个值时,它退化成了一个相互排斥的同步器.类似锁. 以下来看看Semaphore的代码. 它维护了一个内部类Sync来继承AQS,定制tryXXX方法来使…
一.创建线程的三种方式: 创建线程的方式有三种,一是创建Thread实例,二是实现Runnable接口,三是实现Callable接口,Runnable接口和Callable接口的区别是一个无返回值,一个有返回值:不管是Runnable还是Callable接口,都需要借助Thread去运行: (一)继承Thread类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. 创建Thread子类的实例,即创建了线程对象. 调…
前言 之前只是对Java各种锁都有所认识,但没有一个统一的整理及总结,且没有对"锁升级"这一概念的加深理解,今天趁着周末好好整理下之前记过的笔记,并归纳为此博文,主要参考资源为<Java并发编程的艺术>与<Java多线程编程核心技术>,有需要的朋友可以私信评论我,这个是有书签的PDF电子版! 一.Java锁的分类及简单介绍 平时大家都知道的锁一般都有:CAS锁,synchronized锁,ReentranLock锁等,但是并没有了解各自的用处与一些细节,这里用X…
1. synchronized和reentrantlock异同 相同点 都实现了多线程同步和内存可见性语义 都是可重入锁 不同点 实现机制不同 synchronized通过java对象头锁标记和Monitor对象实现 reentrantlock通过CAS.ASQ(AbstractQueuedSynchronizer)和locksupport(用于阻塞和解除阻塞)实现 synchronized依赖jvm内存模型保证包含共享变量的多线程内存可见性 reentrantlock通过ASQ的volatil…
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习之AQS框架(一)概述> <Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁> <Java并发包源码学习之AQS框架(三)LockSupport> 分析源码是非常枯燥乏味的一件事,其实代码本身其实就是最好的说明了,因此基本都是贴出一些代码加上一些注释,…
AbstractQueuedSynchronizer(以下简称AQS)的内容确实有点多,博主考虑再三,还是决定把它拆成三期.原因有三,一是放入同一篇博客势必影响阅读体验,而是为了表达对这个伟大基础并发组件的崇敬之情.第三点其实是为了偷懒. 又扯这么多没用的,还是直接步入正题吧~ AQS介绍 AQS是一个抽象类,它是实现多种并发同步工具的核心组件.比如大名鼎鼎的可重入锁(ReentrantLock),它的底层实现就是借助内部类Sync,而Sync类就是继承了AQS并实现了AQS定义的若干钩子方法.…
上期的<全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础>中介绍了什么是AQS,以及AQS的基本结构.有了这些概念做铺垫之后,我们就可以正式地看看AQS是如何通过state(以下也称资源)和同步队列,实现线程之间的同步功能了 那么线程之间是如何同步呢?其实就是通过资源的获取和释放来进行同步.如果获取到就继续运行,获取不到就放入同步队列阻塞等待,释放就是交出获得的资源,并释放同步队列中需要被唤醒的线程.对,就是这么简单! 本篇我们继续深入AQS内…
一.前言 在锁框架中,AbstractQueuedSynchronizer抽象类可以毫不夸张的说,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.所以很有必要好好分析. 二.AbstractQueuedSynchronizer数据结构 分析类,首先就要分析底层采用了何种数据结构,抓住核心点进行分析,经过分析可知,AbstractQueuedSynchronizer类的数据结构如下 说明:AbstractQueuedSynchronizer类底层的数据结…
本文首发在infoQ    作者:刘锟洋 前言 经过本系列的上半部分JDK1.8 AbstractQueuedSynchronizer的实现分析(上)的解读,相信很多读者已经对AbstractQueuedSynchronizer(下文简称AQS)的独占功能了然于胸,那么,这次我们再借助另一个工具类:CoutDownLatch,换个角度看看AQS的另外一个重要功能——共享功能的实现. AQS共享功能的实现 在开始解读AQS的共享功能前,我们再重温一下CountDownLatch,CountDown…