当前位置 : 主页 > 编程语言 > 其它开发 >

AQS理解

来源:互联网 收集:自由互联 发布时间:2022-06-29
概念: aqs是多线程同步器,他是juc包中多个组件的底层实现,比如lock、countDownLatch、Semaphore都用到了AQS,aqs提供了两种锁的机制分别是排他锁和共享锁。排它锁就是多个线程对同一共享

概念:aqs是多线程同步器,他是juc包中多个组件的底层实现,比如lock、countDownLatch、Semaphore都用到了AQS,aqs提供了两种锁的机制分别是排他锁和共享锁。排它锁就是多个线程对同一共享资源进行竞争的时候,只允许一个线程访问,如lock中的ReentrantLock重入锁。共享锁也成为读锁,就是在多个线程在同一时刻获得这个锁的资源如CountDownLatch、Semaphore。

 

三个核心:

  • 互斥变量的设计:有一个status变量记录锁状态。0代表没有线程持有锁,大于等于1代表已经有线程持有锁资源。

  • 未竞争到锁的线程等待,以及竞争到锁资源释放锁之后的唤醒:未竞争到锁先看队列中有没有节点,没有aqs会生成两个节点(一个空节点状态为0且owner为null,一个放刚刚来的线程)。如果对列中有节点那么尾部插入。竞争到锁之后:重入问题、锁状态为恢复为0、唤醒队列中等待的线程。遍历队列如果这个节点的前一个节点是head,那么尝试加锁,并且将head指向自己,然后断开与前一节点的联系

  • 公平性和非公平性:如果是公平锁:看等待区(等待队列)有没有人,有代表锁肯定被占用了,你就去等待队列等着。调用的是hasQueuedPredecessors()方法去判断。如果是非公平锁:直接看锁标记位是不是0,然后尝试cas替换。

 

为什么aqs使用双向链表:

AQS对CLH进行了改进,后继获取锁的线程在经过有限次的轮询后,依旧获取不到锁将陷入阻塞。优点:减少轮询无效操作;缺点:后继线程Node在阻塞后无法感知前一个线程Node的状态,锁被释放时将无法主动醒来。于是AQS使用了双指针,在CLH的prev基础上增加了next。AQS维护了next指针,以便活跃线程释放锁后主动唤醒后续阻塞线程去竞争锁

上一篇:https证书配置(SSL)nginx服务
下一篇:没有了
网友评论