首页 > 其他 > 详细

AQS原理及其本质

时间:2020-03-20 16:52:17      阅读:37      评论:0      收藏:0      [点我收藏+]

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方法:

  1. tryAcquire:会尝试再次通过CAS获取一次锁。
  2. addWaiter:通过自旋CAS,将当前线程加入上面锁的双向链表(等待队列)中。
  3. acquireQueued:通过自旋,判断当前队列节点是否可以获取锁。

可以看到,当当前线程到头部的时候,尝试CAS更新锁状态,如果更新成功表示该等待线程获取成功。从头部移除。
基本可以确认,释放锁就是对AQS中的状态值State进行修改。同时更新下一个链表中的线程等待节点。

AQS原理及其本质

原文:https://www.cnblogs.com/coding-4-fun/p/12532294.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!