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

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-初探)