JAVA AQS 的理解
- AQS是⼀个JAVA线程同步的核心组件。是JDK中很多锁⼯具的核心组件。
- AQS的锁是先尝试CAS乐观锁去获取锁,获取不到,才会转换为悲观锁
- 在AQS中,维护了⼀个信号量state、加锁线程变量和⼀个线程组成的双向链表队列。
- 加锁
加锁的线程,会根据公平性,决定是否要排队。公平锁,直接到队尾排队。非公平锁,先尝试加锁,如果失败,则到队尾排队
- 解锁
解锁,会唤醒等待队列中的后继节点
- 加锁线程变量就是当前加锁的线程
可以用来做锁的可重入
- state 是一个int, 加锁和解锁都是通过CAS操作state值来实现的
- 通过 volatile 修饰 和 CAS 更新保证了操作的安全性。 其中volatile 保证了可见性,同时禁止指令重排序。但是不保证原子性. CAS 底层是使用 CPU 指令 cmpxchg 对内存中的变量进行比较和交换。
- state 可以用来表示锁重入次数。state=0表示没有线程持有锁,state>0表示有state个线程持有锁,eg: ReentrantLock
- state 还可以用来表示获取操作的线程数据。eg: countdownlatch