锁和并发(2)AQS

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 变为阻塞状态。    
  // 非公平锁时,抢占问题。
 
 
 
 
posted @   a菜搬砖  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示