AQS

AQS介绍
AbstractQueuedSynchronizer,AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器。
AQS 原理
AQS维护一个共享资源state,通过内置的FIFO来完成获取资源线程的排队工作。(这个内置的同步队列称为"CLH"队列)。该队列由一个一个的Node结点组成,每个Node结点维护一个prev引用和next引用,分别指向自己的前驱和后继结点。AQS维护两个指针,分别指向队列头部head和尾部tail。
AQS
其实就是个双端双向链表。
AQS是JUC中很多同步组件的构建基础,简单来讲,它内部实现主要是状态变量state和一个FIFO队列来完成,同步队列的头结点是当前获取到同步状态的结点,获取同步状态state失败的线程,会被构造成一个结点(或共享式或独占式)加入到同步队列尾部(采用自旋CAS来保证此操作的线程安全),随后线程会阻塞;释放时唤醒头结点的后继结点,使其加入对同步状态的争夺中。
总结下获取锁的流程:
调用自定义同步器的tryAcquire()尝试直接去获取资源,如果成功则直接返回;
没成功,则addWaiter()将该线程加入等待队列的尾部,并标记为独占模式;addWaiter()的操作过程是首先尝试快速方式直接放到等待队列的队尾
acquireQueued()使线程在等待队列中休息,有机会时(轮到自己,会被unpark())会去尝试获取资源。获取到资源后才返回。如果在整个等待过程中被中断过,则返回true,否则返回false。
如果线程在等待过程中被中断过,它是不响应的。只是获取资源后才再进行自我中断selfInterrupt(),将中断补上。
AQS

AQS相关的并发类
Semaphore 可以控制指定数量的线程获取资源
CountDownLatch 用来解决一个线程等待多个线程的场景,旅游团团长必须等待所有游到齐才能出发去下一个景点;计数器不能循环使用(案例,通过两个线程池分别获取未对账订单和派送单,最后在主线程之中完成对账操作)
CyclicBarrier 用来解决一组线程之间相互等待,几个驴友之间不离不弃;计数器可以循环使用,同时也可以设置回调函数

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-10-15
相关资源
相似解决方案