`

AQS(线程同步器)介绍

 
阅读更多
1. 什么是AQS

AQS - AbstractQueuedSynchronizer

AQS定义了实现线程同步器的基础框架, 线程同步器的作用是协调多个线程对共享资源的访问。

AbstractQueuedSynchronizer派生出Java并发包的重要类, 如下:

- CountDownLatch(倒计时同步器)

- CyclicBarrier(循环栅栏同步器)
 
- Semaphore(信号量同步器) [ˈseməfɔ:(r)]

- ReentrantLock(可重入锁)

在多个线程共享同一个资源时, 可以基于AQS的相关实现类来实现多线程对该资源的同步访问,
这样可以避免多线程并发访问导致的数据不一致问题。


2. AQS基础

由于AQS里面用到了大量的CAS, 因此学习AQS之前我们还是有必要简单的先了解下CAS、公平锁和非公平锁。

CAS

引用
CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制。

CAS 操作包含三个操作数: 内存位置、预期数值和新值。

CAS 的实现逻辑是将内存位置处的数值与预期数值相比较
    - 若相等   --> 则将内存位置处的值替换为新值。
    - 若不相等 --> 则不做任何操作,这个操作是个原子性操作, java里面的AtomicInteger等类都是通过cas来实现的。



公平锁(先到先得)
引用
先到先得:
    多个线程按照申请锁的顺序去获得锁, 线程会直接进入队列去排队, 队列中第一个才能获得到锁。

优点:
    等待锁的线程不会饿死, 每个线程都可以获取到锁。
缺点:
    整体吞吐效率相对非公平锁要低
    等待队列中除第一个线程以外的所有线程都会阻塞
    CPU唤醒阻塞线程的开销比非公平锁大



非公平锁(弱肉强食)

引用
多个线程去获取锁的时候, 会直接去尝试获取,
获取不到, 再去进入等待队列,
如果能获取到,就直接获取到锁。

优点:
    可以减少CPU唤醒线程的开销
    整体的吞吐效率会高点
    CPU也不必唤醒所有线程, 减少了唤起线程的数量
缺点:
    处于等待队列中的线程有可能要等很久才会获得锁, 可能会饿死。
   
举个例子比喻一下:
    比如我们去食堂就餐的时候都要排队, 大家都按照先来后到的顺序排队打饭,这就是公平锁。
   
    如果等到你准备拿盘子打饭的时候, 直接蹦出了一个五大三粗的胖子插队到你前面,
    你看打不赢他只能忍气吞声让他插队,等胖子打完饭了又来个小个子也来插你队,
    这时候你没法忍了, 直接大吼一声让他滚, 这个小个子只能屁颠屁颠到队尾去排队了这就是非公平锁。


3. AQS源码分析
// 头节点
private transient volatile Node head;

// 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表
private transient volatile Node tail;

// 这个是最重要的,代表当前锁的状态,0代表没有被占用,大于 0 代表有线程持有当前锁
// 这个值可以大于 1,是因为锁可以重入,每次重入都加上 1
private volatile int state;

// 代表当前持有独占锁的线程,举个最重要的使用例子,因为锁可以重入
// reentrantLock.lock()可以嵌套调用多次,所以每次用这个来判断当前线程是否已经拥有了锁
// if (currentThread == getExclusiveOwnerThread()) {state++}
private transient Thread exclusiveOwnerThread; //继承自AbstractOwnableSynchronizer

分享到:
评论

相关推荐

    Java并发编程解析 | 解析AQS基础同步器的设计与实现

    "Java并发编程解析 | 解析AQS基础同步器的设计与实现" 在Java领域中,解决并发编程问题的关键是解决同步和互斥的问题。同步是指线程之间的通信和协作,互斥是指同一时刻只能允许一个线程访问共享资源。Java领域中有...

    Java并发编程:深入解析抽象队列同步器(AQS)及其在Lock中的应用

    AQS是处理线程同步问题的高效工具,是Java并发编程中的核心。文章首先简要介绍了并发编程领域的先驱Doug Lea。重点在于ReentrantLock的分析,它是基于AQS实现的互斥锁。相比synchronized,它提供了更多特性,如手动...

    aqs_demo.rar

    总的来说,AQS同步器和Redisson锁是Java并发编程中不可或缺的工具,它们提供了高效且灵活的线程同步机制,使得开发者能够更好地应对高并发场景,实现稳定、高效的分布式系统。掌握这些技术,对于提升Java开发者的...

    Java并发之AQS详解.pdf

    AbstractQueuedSynchronizer(AQS)是 Java 并发编程中的一个核心组件,提供了一套多线程访问共享资源的同步器框架。AQS 定义了两种资源共享方式:Exclusive(独占)和 Share(共享)。在 AQS 中,维护了一个 ...

    AQS源码分析 (1).pdf

    AQS全称为AbstractQueuedSynchronizer,是java中用于构建锁以及其他同步器的一个框架。在多线程的编程中,同步问题是一个非常重要的问题,而AQS正是为了解决这个问题而生的。 首先,我们需要了解的是AQS的核心思想...

    Java 多线程与并发(10-26)-JUC锁- 锁核心类AQS详解.pdf

    AQS是一个抽象的队列同步器,它基于FIFO(先进先出)队列来管理线程的排队和获取共享资源。它是实现Java并发包中锁和其他同步器的基础框架,例如ReentrantLock(可重入锁)、Semaphore(信号量)、CountDownLatch...

    带你看看Java-AQS同步器 源码解读四 条件队列Condition上

    总的来说,Java AQS的条件队列是实现复杂同步逻辑的关键,它使得线程能够在特定条件满足时才执行,提高了程序的灵活性和效率。通过对AQS源码的深入解读,我们可以更好地理解并发编程的底层机制,从而编写出更加高效...

    Java AQS详解.docx

    AQS 提供了一种基于队列的线程同步机制,允许开发者构建自定义的锁和同步器。在Java并发编程中,如ReentrantLock、Semaphore和CountDownLatch等类的底层实现都离不开AQS。 **一、AQS概述** AQS 是一个抽象的队列...

    多线程面试题

    AQS(AbstractQueuedSynchronizer)是Java中用于构建锁和同步器的框架,它支持独占模式和共享模式的同步器。AQS内部使用一个FIFO队列来管理锁的获取顺序。在这个队列中的线程会按照到达的顺序,等待获取到锁资源。...

    java并发编程:juc、aqs

    `AQS`(AbstractQueuedSynchronizer)是JUC库中的一个关键组件,它是一个抽象基类,为构建自定义的同步器提供了基础框架。AQS通过内部维护一个基于链表的等待队列,有效地管理线程的同步和唤醒,从而实现锁和其他同步...

    JDK_AQS解析

    它提供了一个同步器的框架,其中包含了共享资源的状态管理、线程排队机制等核心功能。开发者可以通过继承AQS并实现其模板方法来构建具体的同步组件,例如`ReentrantLock`、`Semaphore`、`CountDownLatch`等。 #### ...

    JUC核心类AQS的底层原理

    AQS作为Java并发工具包(JUC)中的一个核心抽象类,其设计目的是为了实现各种同步器(如锁、信号量等)。AQS主要通过三个核心组成部分来实现这些同步组件的功能: 1. **State变量及其CAS操作**:AQS维护了一个名为`...

    aqs_java_

    AQS,全称为AbstractQueuedSynchronizer,是一个抽象类,为构建实现阻塞锁和相关同步器(如信号量、事件等)提供了一种基础框架。它内部基于一个FIFO(先进先出)的等待队列来管理线程的同步状态。AQS的设计理念是将...

    并发锁核心类AQS学习笔记

    AQS 是 AbstractQueuedSynchronizer 的简称,AQS 是一个抽象的队列式同步器框架,提供了阻塞锁和 FIFO 队列实现同步操作。JUC 包中的同步类基本都是基于 AQS 同步器来实现的,如 ReentrantLock,Semaphore 等。 二、...

    The java. util. concurrent synchronizer framework.pdf

    AQS(AbstractQueuedSynchronizer)是Java.util.concurrent包中同步器的基础框架,它的核心设计思想与实现方法在Doug Lea先生的这篇论文中有详细的介绍。论文详细阐述了AQS框架的原理、设计、实现、应用以及性能等...

    3.1.4.AQS底层原理分析1

    在Java并发编程中,AbstractQueuedSynchronizer(AQS)是一个核心的同步组件,用于构建锁和同步器的基础框架。AQS是一个抽象类,它提供了线程同步的基本机制,包括线程的排队、等待和唤醒。在Java.util.concurrent...

    7 AQS源码分析.docx

    总的来说,AQS通过维护状态和线程队列,实现了对资源的高效管理,使得开发者能够方便地构建各种锁和同步器。理解AQS的工作原理,有助于我们在编写高并发程序时,更好地利用Java提供的并发工具,提高系统的并行性和...

    AQS和JUC知识点讲解

    4. **自定义同步器**:AQS提供了一套模板方法,允许开发者定义如何获取和释放资源,从而创建自定义的同步组件,如ReentrantLock和Semaphore等。 二、Java Util Concurrency(JUC) JUC是Java并发编程的工具包,...

Global site tag (gtag.js) - Google Analytics