1.AQS具备的特性:
阻塞等待队列 共享/独占 公平/非公平 可重入 允许中断2.Aqs的抽象模型:
2.1.ReentrantLock juc lock接口实现,实现是基于AQS,需要手动加锁跟解锁 ReentrantLock lock(),unlock() 悲观锁 独占 AQS 1.volatile 修饰的 state 作为标识 记录加锁次数 可重入次数 状态 state == 0 无锁状态 2.线程标记 ExclusiveOwnerThread 3.队列 该锁为 同步队列 CLH 队列 3.1 队列主要包括head 头指针 3.2 tail 尾指针 3.3 node 线程信息 node 中包含 线程信息 1.包含prev 头节点指向前一个线程 2.包含next 节点指向后一个线程 3.witastate 修饰的信号状态 4.thread 线程信息 锁释放后 会去唤醒下一个线程,而不是所有线程, 阻塞是使用的unsafe魔术类的pack()和unpack()方法2.2waitsate 信号量状态:
SIGNAL -1 可被唤醒状态 CONDITION -2 条件等待 PROPAGATE -3 //传播 广播 CANCELLED 1 异常状态 0 初始状态 // 从0-->-1--> 才可以被唤醒状态 // 然后,在下一轮循环中阻塞 // 为什么 clh 队列 waitState 从0 --> -1 --> 0 --> -1 // 0 -->-1 持有锁的线程释放锁的时候,需要判断head节点的 waitState是否不是0,去唤醒队列中的第一个非null的线程。 唤醒后继续走循环 尝试获取锁 // 可能再次失败,(非公平状态) -1 -->0 变为阻塞状态。 // 非公平锁时,抢占问题。 标签:状态,队列,AQS,--,并发,线程,唤醒 From: https://www.cnblogs.com/dhdnm/p/16607437.html