美文网首页JUC并发包
并发包同步器的核心AQS-初探

并发包同步器的核心AQS-初探

作者: 于情于你 | 来源:发表于2021-03-17 23:47 被阅读0次

    AQS是啥

        Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。

    核心思想

        如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中。AQS是通过将每条请求共享资源的线程封装成一个节点来实现锁的分配。

    核心组成

    1.CLH队列

        CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态。

    2.Node

        AQS的静态内部类,CLH队列的节点,每个Node绑定一个线程

    Node的属性
    3.同步状态State

        用于展示当前临界资源的获锁情况。
        当state>0时表示已经获取了锁,当state = 0无锁。它提供了三个方法(getState()、setState(int newState)、compareAndSetState(int expect,int update))来对同步状态state进行操作,可以确保对state的操作是安全的。

    4.AQS API

    引用美团技术团队博客的AQS API架构图,我们自定义的同步器只需要调用API层就可以满足


    API架构图
    5.AQS的应用

    独占:ReentrantLock
    共享:Semaphore、CountDownLatch

    相关文章

      网友评论

        本文标题:并发包同步器的核心AQS-初探

        本文链接:https://www.haomeiwen.com/subject/ylascltx.html