面试官:AQS 了解吗,讲一讲吧。
我:.......告辞了。
这是一个老生常谈的面试题,相信大家都可能会碰到过。
有关这一块资料其实网上一搜便是一堆,今天肥壕主要是想结合自己的理解,用更加通俗易懂的方式表达出来,也不涉及任何的源码。
实现原理
AQS(AbstractQueuedSynchronizer),抽象的队列式同步器
AQS 维护了一个 state
(共享资源变量)和一个 FIFO
线程等待队列(CLH 队列),多个线程竞争 state
被阻塞时就会进入此队列中。
State
state
是用 volatile 修饰的一个 int 类型的共享资源变量
资源共享的两种方式:
- Exclusive:独占,只有一个线程能执行,如 ReentrantLock
- Share:共享,多个线程可以同时执行,如 CountDownLatch、CyclicBarrier、Semaphore、ReadWriteLock
CLH 队列(FIFO)
简短说就是一个双向链表,使用内部类 Node 来实现的。head、tail 指针分别指向链表的头部和尾部。
我们一般常用的写法如下: