AQS-ConditionObject 笔记

简介: AQS-ConditionObject 笔记

ConditionObject

属性 说明
Node firstWaiter 头节点
Node lastWaiter 尾节点

为Condition接口实现,Condition的目的主要是替代Object的wait,notify,notifyAll方法的,它是基于Lock实现的.(而Lock是来替代synchronized方法).

结构

ConditionObject队列结构.png

使用时序图

AQS-Condition-使用流程.png


关键方法

阻塞线程:await

对应Object.wait(),通过AQS机制释放锁定的资源,终止当前线程,恢复后使用AQS独占模式重新锁定资源

acquireQueued:此时node节点已转换为AQS中节点

public final void await() throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
    Node node = addConditionWaiter();
    long savedState = fullyRelease(node);
    int interruptMode = 0;
    while (!isOnSyncQueue(node)) {
        LockSupport.park(this);
        if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
            break;
    }
    if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
        interruptMode = REINTERRUPT;
    if (node.nextWaiter != null) // clean up if cancelled
        unlinkCancelledWaiters();
    if (interruptMode != 0)
        reportInterruptAfterWait(interruptMode);
}

AQS-Condition-await.png

唤醒线程:signal

transferForSignal转换节点后await()中acquireQueued(node,savedState)操作的节点已是AQS中的节点

isHeldExclusively:子类实现.判断是否独家持有

public final void signal() {
    if (!isHeldExclusively())
        throw new IllegalMonitorStateException();
    Node first = firstWaiter;
    if (first != null)
        doSignal(first);
}

AQS-Condition-signal.png

目录
相关文章
|
3月前
|
设计模式 存储 Java
【面试问题】什么是 AQS ?
【1月更文挑战第27天】【面试问题】什么是 AQS ?
|
6月前
|
设计模式 Java API
终于弄懂AQS了
大家好,我是三友~~ 相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题。那你是不是很好奇,这些Lock锁api是如何实现的呢?本文就是来探讨一下这些Lock锁底层的AQS(AbstractQueuedSynchronizer)到底是如何实现的。
|
6月前
AQS源码解读之一
AQS源码解读之一
23 0
|
8月前
|
Java 开发者
每天一道面试题之-AQS
每天一道面试题之-AQS
78 0
|
10月前
|
安全
AQS学习:ReentrantLock源码解析
AQS学习:ReentrantLock源码解析
39 0
|
算法 Java API
深入浅出理解Java并发AQS的共享锁模式
深入浅出理解Java并发AQS的共享锁模式
95 0
深入浅出理解Java并发AQS的共享锁模式
|
设计模式 SpringCloudAlibaba 安全
聊一聊 ReentrantLock 和 AQS 那点事
聊一聊 ReentrantLock 和 AQS 那点事
132 0
聊一聊 ReentrantLock 和 AQS 那点事
|
Java
Java并发编程 - AQS 简介(AbstractQueuedSynchronizer)
Java并发编程 - AQS 简介(AbstractQueuedSynchronizer)
124 0
Java并发编程 - AQS 简介(AbstractQueuedSynchronizer)
把 AQS 源码扒个「体无完肤」​!
AbstractQueuedSynchronizer是 Doug Lea 大师创作的用来构建锁或者其他同步组件的基础框架类。J.U.C 中许多锁和并发工具类的核心实现都依赖于 AQS,如:ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 等。
88 0
|
存储 Java
Java并发之AQS源码分析(一)
AQS 全称是 AbstractQueuedSynchronizer,顾名思义,是一个用来构建锁和同步器的框架,它底层用了 CAS 技术来保证操作的原子性,同时利用 FIFO 队列实现线程间的锁竞争,将基础的同步相关抽象细节放在 AQS,这也是 ReentrantLock、CountDownLatch 等同步工具实现同步的底层实现机制。它能够成为实现大部分同步需求的基础,也是 J.U.C 并发包同步的核心基础组件。
105 0
Java并发之AQS源码分析(一)