AQS--基础(待整理)

AQS 是实现 ReentrantLock、CountDownLatch、Semaphore、FutureTask 等类的基础。

AQS属性

//头结点 当前持有锁的线程
 private transient volatile Node head;

// 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表
private transient volatile Node tail;

// 这个是最重要的,代表当前锁的状态,0代表没有被占用,大于 0 代表有线程持有当前锁
// 这个值可以大于 1,是因为锁可以重入,每次重入都加上 1
private volatile int state;

//代表当前持有独占锁的线程
private transient Thread exclusiveOwnerThread;

AQS里面有两种队列:阻塞队列和等待队列,其中每个线程被包装成一个 Node 实例,数据结构(thread + waitStatus + pre + next)是链表

static final class Node {
    // 当前节点处于共享模式的标记
    static final Node SHARED = new Node();
    // 当前节点处于独占模式的标记
    static final Node EXCLUSIVE = null;

    // ======== 下面的几个int常量是给waitStatus用的 ===========

    // 代码此线程取消了争抢这个锁
    static final int CANCELLED =  1;
   
    // 释放资源后需唤醒后继节点
    static final int SIGNAL    = -1;
   
    //等待condition唤醒
    // CONDITION队列中的状态,CLH队列中节点没有该状态,当将一个node从CONDITION队列中transfer        到CLH队列中时,状态由CONDITION转换成0
    static final int CONDITION = -2;
  
     //工作于共享锁状态,需要向后传播,
     //比如根据资源是否剩余,唤醒后继节点该状态表示下一次节点如果是Shared的,则无条件获取锁。
    static final int PROPAGATE = -3;
    // =====================================================


    // 取值为上面的1、-1、-2、-3,或者0(初始)
    volatile int waitStatus;
    // 前驱节点
    volatile Node prev;
    // 后继节点
    volatile Node next;
    
    volatile Thread thread;

}

以上部分内容引自https://javadoop.com/,写得特别好!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值