同步器AQS解析

什么是同步器?

  多线程并发执行,通过某种共享状态来同步,当共享状态满足某种条件,才能触发线程开始执行操作。

AbstractQueuedSynchronizer(AQS)

  这是一个抽象类,它提供多线程下不同共享模式的操作,实现它可以自定义同步器。

可以看出,ReentrantLock和ReentrantReadWriteLock的内部类都是继承于这个抽象类。

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {

    private static final long serialVersionUID = 7270805090050340580L;
    // 底层操作
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    // 线程节点
    static final class Node {
        static final Node SHARED = new Node();
        static final Node EXCLUSIVE = null;
        static final int CANCELLED =  1;
        static final int SIGNAL    = -1;
        static final int CONDITION = -2;
        static final int PROPAGATE = -3;
        volatile int waitStatus;
        volatile Node prev;
        volatile Node next;
        volatile Thread thread;
        Node nextWaiter;

        final boolean isShared() {
            return nextWaiter == SHARED;
        }

        final Node predecessor() throws NullPointerException {
            Node p = prev;
            if (p == null)
                throw new NullPointerException();
            else
                return p;
        }

        Node() {
        }

        Node(Thread thread, Node mode) {
            this.nextWaiter = mode;
            this.thread = thread;
        }

        Node(Thread thread, int waitStatus) {
            this.waitStatus = waitStatus;
            this.thread = thread;
        }
    }
    // 头结点
    private transient volatile Node head;
    // 尾节点
    private transient volatile Node tail;
    // 共享状态
    private volatile int state;
    // 独占锁获取
    protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }
    // 独占锁释放
    protected boolean tryRelease(int arg) {
        throw new UnsupportedOperationException();
    }
    // 共享锁获取
    protected int tryAcquireShared(int arg) {
        throw new UnsupportedOperationException();
    }
    // 共享锁释放
    protected boolean tryReleaseShared(int arg) {
        throw new UnsupportedOperationException();
    }
    // 快速判断被线程独占
    protected boolean isHeldExclusively() {
        throw new UnsupportedOperationException();
    }
    // 获取同步状态
    protected final int getState() {
        return state;
    }
    // 设置同步状态
    protected final void setState(int newState) {
        state = newState;
    }
    // 原子操作同步状态
    protected final boolean compareAndSetState(int expect, int update) {
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }
    // 其他方法...
}

以上就是AQS里关键的几个需要重写的方法,这里没有将方法定义为abstract,而是方法只抛出一个异常,这是因为AQS有很多方法可以重写,而又不是每个都需要,所以就没有写成abstract。

原文地址:https://www.cnblogs.com/huanStephen/p/8228105.html

时间: 2024-10-11 03:09:14

同步器AQS解析的相关文章

队列同步器——AQS

一.AQS概念 队列同步器AQS(AbstractQueuedSynchronizer)是用来构建锁或者其它同步组件的基础框架,使用int成员变量state表示同步状态,通过内部的FIFO双向等待队列来完成线程的排队工作.同步器中的等待队列可以简单的理解为"等待锁的线程队列". 子类通过继承AQS并重写其指定方法来管理同步状态: 子类被推荐为自定义同步组件的静态内部类,同步器本身并没有实现任何的同步接口,仅定义了若干同步状态获取和释放的方法供自定义同步组件使用: 同步器支持独占式(EX

java AQS 解析

昨天看了一下ReentrantLock文章,写了点东西,端午自己在家无聊,学习下AQS原理.Info网站确实个有料的网站,非常不错,里面有好多大牛在写技术文章,受益匪浅. 我想先从AQS的功能上说明下AQS,站在使用者的角度,AQS的功能可以分为两类:独占功能和共享功能,它的所有子类中,要么实现并使用了它独占功能的API,要么使用了共享锁的功能,而不会同时使用两套API,即便是它最有名的子类ReentrantReadWriteLock,也是通过两个内部类:读锁和写锁,分别实现的两套API来实现的

AQS源码解析(1)-CLH

目录 AQS解析 一.简介 二.同步的状态和基本属性 三.入队 addWaiter 3.1 基本步骤介绍 3.2 addWaiter() 3.3 enq(Node node) 四.出队 参考 AQS解析 一.简介 Provides a framework for implementing blocking locks and related synchronizers (semaphores, events, etc) that rely on first-in-first-out (FIFO)

JUC回顾之-AQS同步器的实现原理

1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改.同步器内部依赖一个FIFO的双向队列来完成资源获取线程的排队工作. 2.同步器的应用 同步器主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,对同步状态的修改或者访问主要通过同步器提供的3个方法: getState() 获取当前的同步状态 setState(int newState) 设置当前同步状态 co

Java并发编程(5)- J.U.C之AQS及其相关组件详解

J.U.C之AQS-介绍 Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock.Semaphore,而它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer(抽象队列同步器),简称AQS. AQS是JDK提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架,它使用一个int类型的volatile变量(命名为state)来维护同步状态,通过内置的FIFO队列来完成资源获取线程的排队工

8.初识Lock与AbstractQueuedSynchronizer(AQS)

1. concurrent包的结构层次 在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们对并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱.这些代码在java.util.concurrent包下.如下图,即为concurrent包的目录结构图. 其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及executors,这些就是concurrent包中的精华,之后会一一进行学习.而这些类的实现主要是

JUC并发编程--AQS

转自: https://www.jianshu.com/p/d8eeb31bee5c 前言 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock.ReadWriteLock(实现类ReentrantReadWriteLock),内部实现都依赖AbstractQueuedSynchronizer类,接下去让我们看看Doug Lea大神是如何使用一个普通类就完成了代码块的并发访问控制.为了方便,本文中使用AQS代替AbstractQue

Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ? 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本文中,凯哥就用AQS来代替这个类).我们先来了解这个类.对这个类了解之后,学习后面的会更容易了. 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<Lock系列>教程的第一篇:<Java并发包下锁学习第二篇:队列同步器>. 本文主要内容:同步器介绍:同步器

java十年技术栈[总结复习用]

以下摘自http://www.tvtv223.com/so/8/default/8.html#36-数据库的分库分表mycat java技术栈 参考了众多资料,这里就不再详细列举了,可以自行去搜索 1 java基础: 1.1 算法 1.1 排序算法:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序 1.2 二叉查找树.红黑树.B树.B+树.LSM树(分别有对应的应用,数据库.HBase) 1.3 BitSet解决数据重复和是否存在等问题 1.2 基本 2.1