AQS重入锁原理解析(一)之---基础属性

在学习JUC下包的时候,必然会学习到Lock,同时就会了解到ReentrantLock,而当我们深入了解ReentrantLock锁原理的时候,就会发现它实现了AbstractQueuedSynchronizer的功能,也就是简称的AQS。今天就先从里层到外层的学习,先学习AQS的一些原理属性相关知识。
一:什么是AQS
AbstractQueuedSynchronizer,抽象队列同步器。简称AQS。是JDK提供的,位于J.U.C locks包下的一个抽象类,相当于提供了一个模板,实现让线程排队访问资源的功能,保证资源在被操作的时候是线程安全的。 在J.U.C下的许多类,例如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore,都是通过继承AQS抽象类,加入自己的特定逻辑、实现自己特有的功能。
二:AQS的原理
AQS中维护了一个volatile int state,用来代表共享资源。 与此同时还维护了一个FIFO线程等待队列,当多线程争抢资源遇到阻塞(当state大于0的时候,代表当前资源已经被占有,即遇到了阻塞)的时候会进入此队列等待。 使用volatile关键字可以保证多个线程操作state的时候,线程在任何时候都读到的是最新的值。 等待对列中的线程是通过JVM提供的UNSAFE.park()方法,实现对线程的挂起操作。
三:AbstractQueuedSynchronizer的相关属性
3.1 SHARED: 枚举:共享模式

static final Node SHARED = new Node();

3.2 EXCLUSIVE: 枚举: 独占模式

      static final Node EXCLUSIVE = null;

3.3CANCELLED: 表示当前节点处于 取消状态

static final int CANCELLED =  1;

3.4 SIGNAL: 表示当前节点需要唤醒他的后继节点

 static final int SIGNAL    = -1;

3.5 waitStatus: 当前线程的node状态,可选值(0,signal(-1),CANCELLED (1)

 volatile int waitStatus;

3.6 prev:因为node 需要构建成 fifo队列, 索引 prev 指向前继节点

  volatile Node prev;

3.7 next: 因为node 需要构建成 fifo队列, 索引 next 指向后继节点

 volatile Node next;

3.8 thread : 当前node 封装的 线程

volatile Thread thread;

3.9 head: 头结点

  private transient volatile Node head;

3.10 tail:阻塞队列的尾结点 (阻塞队列不包含 头结点 head.next --> tail 认为是阻塞队列)

private transient volatile Node tail;

3.11 state 在独占模式: 0 表示未加锁状态; >0 表示已经加锁状态

  private volatile int state;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

virtuousOne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值