AQS是一个队列同步器,J.U.C是基于AQS实现的,设计模式是模板模式
核心数据结构双向链表 + state(锁状态)
底层操作CAS
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
AQS中的int类型的state值,这里就是通过CAS(乐观锁)去修改state的值。lock的基本操作还是通过乐观锁来实现的。获取锁通过CAS,那么没有获取到锁的,执行else逻辑的acquire方法:
可以看到,当当前线程到头部的时候,尝试CAS更新锁状态,如果更新成功表示该等待线程获取成功。从头部移除。
基本可以确认,释放锁就是对AQS中的状态值State进行修改。同时更新下一个链表中的线程等待节点。
原文:https://www.cnblogs.com/coding-4-fun/p/12532294.html