AQS底层实现原理

前置知识:

①公平锁和非公平锁

②可重入锁

③LockSupport

④自旋锁

⑤数据结构之链表

⑥设计模式之模板设计模式

前言

字面意思:抽象的队列同步器

技术翻译:是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石, 通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态。

AQS是JUC内容中最重要的基石,涵盖内容:ReentrantLock、ReentrantReadWriteLock、CountdownLatch、CyclicBarrier、Semaphore。

解释说明:

        抢到资源的线程直接使用办理业务,抢占不到资源的线程的必然涉及一种排队等候机制,抢占资源失败的线程继续去等待(类似办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等候),仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)。
 
        既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?
 
        如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS的抽象表现。它将请求共享资源的线程封装成队列的结点(Node) ,通过CAS、自旋以及LockSuport.park()的方式,维护state变量的状态,使并发达到同步的效果。

ReentrantLock原理

需要队列

         AQS使用一个volatile的int类型的成员变量来表示同步状态,通过内置的 FIFO队列来完成资源获取的排队工作将每条要去抢占资源的线程封装成 一个Node节点来实现锁的分配,通过CAS完成对State值的修改。

AQS源码解读案例图示

扩展

1、AQS里面有个变量叫State,它的值有几种?

     3个状态:没占用是0,占用了是1,大于1是可重入锁。

2、如果AB两个线程进来了以后,请问这个总共有多少个Node节点?

    3个,除了A和B两个线程Node节点外,还包括首节点的哨兵节点。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章