背景和作用

在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些特性的实现。

AQS


  1. public abstract class AbstractOwnableSynchronizer
  2. implements java.io.Serializable {
  3. /**
  4. * Empty constructor for use by subclasses.
  5. */
  6. protected AbstractOwnableSynchronizer() { }
  7. /**
  8. * The current owner of exclusive mode synchronization.
  9. */
  10. //独占模式下的线程
  11. private transient Thread exclusiveOwnerThread;
  12. // getter、setter
  13. protected final void setExclusiveOwnerThread(Thread thread) {
  14. exclusiveOwnerThread = thread;
  15. }
  16. protected final Thread getExclusiveOwnerThread() {
  17. return exclusiveOwnerThread;
  18. }
  19. }

AQS#Node


  1. /** Marker to indicate a node is waiting in shared mode */
  2. static final Node SHARED = new Node();
  3. /** Marker to indicate a node is waiting in exclusive mode */
  4. static final Node EXCLUSIVE = null;
  5. /** waitStatus value to indicate thread has cancelled */
  6. static final int CANCELLED = 1;
  7. /** waitStatus value to indicate successor's thread needs unparking */
  8. static final int SIGNAL = -1;
  9. /** waitStatus value to indicate thread is waiting on condition */
  10. static final int CONDITION = -2;
  11. /**
  12. * waitStatus value to indicate the next acquireShared should
  13. * unconditionally propagate
  14. */
  15. static final int PROPAGATE = -3;
  16. // 该变量主要记录线程的状态,确保线程是有效的,CANCELLED、SIGNAL、CONDITION、PROPAGATE
  17. volatile int waitStatus;
  18. volatile Node prev;
  19. volatile Node next;
  20. volatile Thread thread;
  21. Node() { // Used to establish initial head or SHARED marker
  22. }
  23. Node(Thread thread, Node mode) { // Used by addWaiter
  24. this.nextWaiter = mode;
  25. this.thread = thread;
  26. }
  27. Node(Thread thread, int waitStatus) { // Used by Condition
  28. this.waitStatus = waitStatus;
  29. this.thread = thread;
  30. }

AbstractQueuedSynchronizer

AQS使用CLH队列来实现线程排队的功能,CLH队列的原理是一个双向链表,每个链表由Node节点组成,Node节点保存prev和next两个指针,并保存指向线程的指针。

  1. /**
  2. * Head of the wait queue, lazily initialized. Except for
  3. * initialization, it is modified only via method setHead. Note:
  4. * If head exists, its waitStatus is guaranteed not to be
  5. * CANCELLED.
  6. */
  7. // 记录CLH的头部节点,目的是配合tail实现出队操作
  8. private transient volatile Node head;
  9. /**
  10. * Tail of the wait queue, lazily initialized. Modified only via
  11. * method enq to add new wait node.
  12. */
  13. // 记录CLH的尾部节点
  14. private transient volatile Node tail;
  15. /**
  16. * The synchronization state.
  17. */
  18. // 用于记录加锁的次数,同一个线程加两次锁,则state = 2
  19. private volatile int state;
  20. /**
  21. * Inserts node into queue, initializing if necessary. See picture above.
  22. * @param node the node to insert
  23. * @return node's predecessor
  24. */
  25. // 入队操作
  26. private Node enq(final Node node) {
  27. for (;;) {
  28. Node t = tail;
  29. if (t == null) { // Must initialize
  30. if (compareAndSetHead(new Node()))
  31. tail = head;
  32. } else {
  33. node.prev = t;
  34. if (compareAndSetTail(t, node)) {
  35. t.next = node;
  36. return t;
  37. }
  38. }
  39. }
  40. }

Java核心复习——J.U.C AbstractQueuedSynchronizer的更多相关文章

  1. Java核心复习 —— J.U.C 并发工具类

    一.CountDownLatch 文档描述 A synchronization aid that allows one or more threads to wait until* a set of ...

  2. Java核心复习——J.U.C LinkedBlockingQueue源码分析

    参考文档 LinkedBlockingQueue和ArrayBlockingQueue的异同

  3. Java核心复习——J.U.C ArrayBlockingQueue源码分析

    介绍 依赖关系 源码 构造方法 public ArrayBlockingQueue(int capacity) { this(capacity, false);//默认构造非公平的有界队列 } pub ...

  4. Java核心复习——线程池ThreadPoolExecutor源码分析

    一.线程池的介绍 线程池一种性能优化的重要手段.优化点在于创建线程和销毁线程会带来资源和时间上的消耗,而且线程池可以对线程进行管理,则可以减少这种损耗. 使用线程池的好处如下: 降低资源的消耗 提高响 ...

  5. Java:核心概念j积累(一)

    1.      抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过 ...

  6. Java核心复习—— 原子性、有序性与Happens-Before

    一. 产生并发Bug的源头 可见性 缓存导致的可见性问题 原子性 线程切换带来的原子性问题 有序性 编译优化带来的有序性问题 上面讲到了 volatile 与可见性,本章再主要讲下原子性.有序性与Ha ...

  7. Java核心复习——synchronized

    一.概念 利用锁机制实现线程同步,synchronized关键字的底层交由了JVM通过C++来实现 Java中的锁有两大特性: 互斥性 同一时间,只允许一个线程持有某个对象锁. 可见性 锁释放前,线程 ...

  8. Java核心复习—— volatile 与可见性

    一.介绍 volatile保证共享变量的"可见性".可见性指的是当一个线程修改变量时,另一个线程能读到这个修改的值. 这里就要提出几个问题. 问题1:为什么一个线程修改时,另一个线 ...

  9. Java核心复习——CompletableFuture

    介绍 JDK1.8引入CompletableFuture类. 使用方法 public class CompletableFutureTest { private static ExecutorServ ...

随机推荐

  1. npm查看包版本

    点击跳转 ~ 会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0 ^ 会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包 ...

  2. FICO-错误日志集

    1.F-02报错 System error in routine FI_TAX_CHK_PRICING_DATA error code 13 function builder TAX2 程序 FI_T ...

  3. OpenStack kilo版(4) Glance部署

    Glance简介 Glance-api:接受云系统镜像的构建.删除.读取请求 Glance-Registry:云系统的镜像注册服务 部署在controller节点 配置数据库 MariaDB [(no ...

  4. Python中的上下文管理器(contextlib模块)

    上下文管理器的任务是:代码块执行前准备,代码块执行后收拾 1 如何使用上下文管理器: 打开一个文件,并写入"hello world" filename="my.txt&q ...

  5. Android笔记(十一) Android中的布局——网格布局

    网格布局是Android4.0新增的布局管理器,因此需要在Android4.0之后的版本才可以使用,之前的平台使用该布局的话,需要导入相应的支持库. GridLayout的作用类似于HTML中的tab ...

  6. testlink关联redmine设置

    Testlink关联Redmine 公司用testlink对测试用例进行维护,redmine关系项目及bug,所以为了方便期间,将Testlink关联Redmine,方便测试用例执行后,在redmin ...

  7. 五、MySQL系列之高级知识(五)

    本篇 主要介绍MySQL的高级知识---视图.事件.索引等相关知识: 一.视图 在学习视图时我们需要什么是视图,视图有哪些好处以及视图的相关操作: 1.1  什么是视图? 关于视图通俗来讲就是一条se ...

  8. 华为SDN:解决传统网络3大问题

    转:http://mp.ofweek.com/tele/a145613326756 科技潮人 2013-08-05 14:20 传统网络之困 互联网爆炸式增长,除了规模和发展速度远超之前所有曾出现的数 ...

  9. Django :中间 件与csrf

    一.中间件 什么是中间件 中间件有什么用 自定义中间件 中间件应用场景 二.csrf csrf token跨站请求伪造 一.中间件 1.什么是中间件 中间件顾名思义,是介于request与respon ...

  10. 助教培训总结——熟练掌握GitHub及Git的使用方法

    一.Git 命令的理解和使用 1.使用git前需要建立一个本地仓库,用Git GUI Here的话就可以直接选择Create New Repository.Git Bash Here输入 命令git ...