juc:AQS

参考:

一文搞懂 Java 中的锁原理、锁优化、CAS、AQS 详解!

我画了35张图就是为了让你深入 AQS

我画了35张图让你深入 AQS

你必须要知道的锁原理、锁优化、CAS、AQS

Java中的锁[原理、锁优化、CAS、AQS

原创】14 | AQS源码分析

原创】Java并发编程系列14 | AQS源码分析

原创】14 | AQS源码分析

AQS基础:多图详解CLH锁的原理与实现

AQS(抽象同步队列)解析与实战

一文搞懂AQS及其组件的核心原理

万字超强图文讲解AQS以及ReentrantLock应用(建议收藏)

AQS共享模式与并发工具类的实现

收藏:

【死磕Java并发】—–J.U.C之AQS

AQS简介

1、简介

Java的内置锁一直都是备受争议的,

在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,

虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:

虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),

但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。

 

在介绍Lock之前,我们需要先熟悉一个非常重要的组件,掌握了该组件JUC包下面很多问题都不在是问题了。该组件就是AQS。

AQS,AbstractQueuedSynchronizer,即队列同步器。

它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),

JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。

它是JUC并发包中的核心基础组件。

AQS解决了实现同步器时涉及的大量细节问题,

例如获取同步状态、FIFO同步队列。基于AQS来构建同步器可以带来很多好处。

它不仅能够极大地减少实现工作,而且也不必处理在多个位置上发生的竞争问题。

在基于AQS构建的同步器中,只能在一个时刻发生阻塞,从而降低上下文切换的开销,提高了吞吐量。

同时在设计AQS时充分考虑了可伸缩行,因此J.U.C中所有基于AQS构建的同步器均可以获得这个优势。

AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。

AQS使用一个int类型的成员变量state来表示同步状态,

当state>0时表示已经获取了锁,当state = 0时表示释放了锁。

它提供了三个方法(getState()、setState(int newState)、compareAndSetState(int expect,int update))来对同步状态state进行操作,

当然AQS可以确保对state的操作是安全的。

AQS通过内置的FIFO同步队列来完成资源获取线程的排队工作,

如果当前线程获取同步状态失败(锁)时,AQS则会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,

同时会阻塞当前线程,当同步状态释放时,则会把节点中的线程唤醒,使其再次尝试获取同步状态

 

 

 

 

 

posted @ 2019-12-15 15:08  弱水三千12138  阅读(269)  评论(0)    收藏  举报