AQS原理

作者: byamao1 | 来源:发表于2019-03-26 17:05 被阅读0次

知识点

AQS维护着两个队列:

  • 一个是由AQS类维护的CLH队列(用于运行CLH算法)
  • 另一个是由AQS的内部类ConditionObject维护的Condition队列(用于支持线程间的同步,提供await,signal,signalAll方法)。

关于锁

  • 锁的释放:通过持有锁的线程对CLH队列的下个节点调用LockSupport.unpark(s.thread);
  • 加锁:调用LockSupport.park(this);将本线程阻塞

Node.SIGNAL有2个作用:

  • 前继节点为SIGNAL时,后继节点会被挂起
  • 前继节点释放锁或被取消之后,必须唤醒(unparking)其后继结点

共享模式和独占模式在代码上的区分点:

doAcquireShared(int arg)中:
int r = tryAcquireShared(arg);  //r说明可以多线程共享锁
setHeadAndPropagate(node, r);  //显示当本节点获得锁后,还要通知后续节点继续获取锁

AQS中对CLH算法的实现与标准的CLH算法有什么异同?

到这里已经可以解答这个问题了。AQS到底在哪些地方变种CLH锁算法?

  • CLH是一种自旋锁算法(在得到锁之前会不停地自旋),而AQS会在几次自旋失败后就将线程阻塞,这是为了避免不必要地占用CPU;
  • CLH是自旋在前继节点的标志位上的,而AQS是自旋在p == head上面(即不停地判断前继节点是否是头节点),只有在发现前继节点是头节点时,才会通过tryAcquire尝试获得锁,这里有一个比较另我困惑的地方,就是head是一个volatile的全局引用,这么做的话显然违背了CLH锁的Local Spin的思想,具体原因未知,可能是因为AQS最初就是被设计为阻塞的同步器而不是自旋锁吧。

Condition

Node类的nextWaiter字段其实是用来存放Condition队列的后继的,要和next字段(用来存放CLH队列后继)进行区分。

之所以Condition队列和CLH队列都采用Node类作为节点的原因就是为了方便将节点从Condition队列搬运到CLH队列。

图解java.util.concurrent源码(一)AbstractQueuedSynchronizer(AQS)

相关文章

  • AQS原理及CAS

    AQS原理 CAS原理

  • 原理剖析(第 005 篇)AQS工作原理分析

    原理剖析(第 005 篇)AQS工作原理分析 一、大致介绍 二、简单认识AQS 2.1 何为AQS? 2.2 AQ...

  • AQS详解

    AQS详解:AQS原理AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了jav...

  • 死磕 java同步系列之AQS起篇

    问题 (1)AQS是什么? (2)AQS的定位? (3)AQS的实现原理? (4)基于AQS实现自己的锁? 简介 ...

  • J.U.C 之AQS

    J.U.C 之AQS AbstractQueuedSynchronizer - AQS 实现原理 使用Node实现...

  • AQS原理解析(二、共享模式)

    上一篇介绍了AQS独占模式的原理,参考链接AQS原理解析(一),这篇介绍一下AQS的共享模式如何实现的。 共享模式...

  • ReentrantLock(AQS),Volatile,Sync

    本文参考: JUC学习(八):AQS的CLH队列并发编程——详解 AQS CLH 锁JMM和底层实现原理 AQS ...

  • Java - AQS原理

    AQS 实现原理 AQS:AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同...

  • AQS之同步器

    AQS之独占锁AQS之共享锁AQS之Condition 在了解了AQS的实现原理之后再来看这些同步器会觉得很亲切,...

  • java并发包中aqs浅谈

    aqs原理 aqs即AbstractQueuedSynchronizer,是java并发包中的一个抽象类,Reen...

网友评论

      本文标题:AQS原理

      本文链接:https://www.haomeiwen.com/subject/rzwlkqtx.html