当前位置:   article > 正文

AQS基本原理_aqs有几个队列

aqs有几个队列

什么是AQS#

AQS即AbstractQueuedSynchronizer,是一个用于构建锁和同步器的框架。它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可能在一个时刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。

AQS支持独占锁(exclusive)和共享锁(share)两种模式。

  • 独占锁:只能被一个线程获取到(Reentrantlock)
  • 共享锁:可以被多个线程同时获取(CountDownLatch,ReadWriteLock).

无论是独占锁还是共享锁,本质上都是对AQS内部的一个变量state的获取。state是一个原子的int变量,用来表示锁状态、资源数等。

AQS内部的数据结构与原理#

AQS内部实现了两个队列,一个同步队列,一个条件队列。

 

同步队列的作用是:当线程获取资源失败之后,就进入同步队列的尾部保持自旋等待,不断判断自己是否是链表的头节点,如果是头节点,就不断参试获取资源,获取成功后则退出同步队列。
条件队列是为Lock实现的一个基础同步器,并且一个线程可能会有多个条件队列,只有在使用了Condition才会存在条件队列。

同步队列和条件队列都是由一个个Node组成的。AQS内部有一个静态内部类Node

  1. static final class Node {
  2. static final Node EXCLUSIVE = null;
  3. //当前节点由于超时或中断被取消
  4. static final int CANCELLED = 1;
  5. //表示当前节点的前节点被阻塞
  6. static final int SIGNAL = -1;
  7. //当前节点在等待condition
  8. static final int CONDITION = -2;
  9. //状态需要向后传播
  10. static final int PROPAGATE = -3;
  11. volatile int waitStatus;
  12. volatile Node prev;
  13. volatile Node next;
  14. volatile Thread thread;
  15. Node nextWaiter;
  16. final boolean isShared() {
  17. return nextWaiter == SHARED;
  18. }
  19. final Node predecessor() throws NullPointerException {
  20. Node p = prev;
  21. if (p == null)
  22. throw new NullPointerException();
  23. else
  24. return p;
  25. }
  26. Node() { // Used to establish initial head or SHARED marker
  27. }
  28. Node(Thread thread, Node mode) { // Used by addWaiter
  29. this.nextWaiter = mode;
  30. this.thread = thread;
  31. }
  32. Node(Thread thread, int waitStatus) { // Used by Condition
  33. this.waitStatus = waitStatus;
  34. this.thread = thread;
  35. }
  36. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/149129
推荐阅读
相关标签
  

闽ICP备14008679号