AQS是Lock的底层。
构成
AbstractQueuedSynchronizer是个抽象类,包含一个state和一个双向链表
其中
- state是用volatile修饰,保证state的线程可见性
- 双向链表是线程的等待队列,采用CAS进行加入和取出操作
实现
不同的锁类型,对AQS中的state和链表有不同的实现。例如
- 在reentrantLock中,state的作用是记录了偏向锁的概念。当有一个线程加锁时,state设置为1,其他线程如果看到state !=0,则加入等待队列。如果当前线程,再次加锁,则state设置为2,以此类推。
- 在countdownLatch中,state的作用则是记录了countdown的数量。每次countdown的时候,state-1。
varHandler
在jdk1.9之后,增加了varHandler对象。该对象指的是引用。可以通过该引用来改变成员变量的值。
相比反射,好处有2个
- 反射每次改变值,都需要校验,而varHandler不需要,相等于直接改二进制码
- varHandler有cas方法,所以能将普通的成员对象操作变成原子操作