AQS源码解读之一

简介: AQS源码解读之一

从ReentrantLock的lock和unlock 方法跟踪 看AQS源码。

public class Concurrent {
    public static void main(String[] args) {
        // 以ReentrantLock 为例进行解读
        Lock lock = new ReentrantLock();
        lock.lock();
        try {
        }finally {
            lock.unlock();
        }
    }
}

进入ReentrantLock 无参构造类中

无参构造类中, 默认使用的是非公平锁


然后进入NonfairSync 类中 ,继承自Sync 类

Sync类是继承AbstractQueuedSynchronizer类 ,这个类AQS

若是前面没有锁占用,则 将通过CAS 将 state  值  由0设置为1, 表示占用锁。

若是前面有锁占用在执行, 则调用acquire方法

那我们进入acquire方法看下。

acquire  方法里面有 tryAcquire(args), 表示获取锁


查看下nonfairTryAcquire(1);



尝试获取锁,获取不到,才会阻塞自己。


不是当前线程的话, 则进入等待队列中。if(!tryAcquire(arg) &&

  acquireQueued(addWaiter(Node.EXCLUSIVE), arg))


enq 方法则是设置CLH队列, 若是队列中先前没有任务


若是队列中有任务,则进入 if(pred != null){ }  的逻辑

入队操作


进入acquireQueued方法



等待挂起的过程


进入unlock方法




至此算是走完了一个正常的流程

总结, 从ReentrantLock  使用跟踪源码, 可以发现  ReentrantLock 是基于AQS 基石实现的。

AQS 底层主要是通过CLH和  状态state 进行维护的。  AQS中 CLH是虚拟的双向链表结构。

里面有Node 节点 ,这个Node 节点相当于 是一个 队列对象, 对象中包含了  head  tail   prev  next   头尾上下节点,   还有个waitStatus。node里面还有 线程Thread  , 相对于 node 节点的 Key ,可以仿照 HashMap 的键值对进行理解。Node 里面还有些枚举状态位。


收录于合集 #同步类AQS

2

上一篇ReentrantLock和Synchronized简单比较


目录
相关文章
|
3月前
|
存储 Java
JAVA并发编程AQS原理剖析
很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》,希望可以帮到大家巩固相关核心技术原理。今天我们聊聊AQS....
非公平锁实现原理+源码解读
非公平锁实现原理+源码解读
|
Java 程序员 API
AQS 原理解读
AQS 原理解读
|
机器学习/深度学习 Java 调度
浅谈AQS原理
经典八股文之AQS原理
205 0
|
机器学习/深度学习 安全 Java
java并发原理实战(10)--AQS 和公平锁分析
java并发原理实战(10)--AQS 和公平锁分析
137 0
java并发原理实战(10)--AQS 和公平锁分析
|
设计模式 Java
JUC并发编程——AQS源码解读
JUC并发编程——AQS源码解读
191 0
JUC并发编程——AQS源码解读
|
存储 Java
Java并发之AQS源码分析(一)
AQS 全称是 AbstractQueuedSynchronizer,顾名思义,是一个用来构建锁和同步器的框架,它底层用了 CAS 技术来保证操作的原子性,同时利用 FIFO 队列实现线程间的锁竞争,将基础的同步相关抽象细节放在 AQS,这也是 ReentrantLock、CountDownLatch 等同步工具实现同步的底层实现机制。它能够成为实现大部分同步需求的基础,也是 J.U.C 并发包同步的核心基础组件。
127 0
Java并发之AQS源码分析(一)
|
安全 Java
Java并发之AQS源码分析(二)
我在 Java并发之AQS源码分析(一)这篇文章中,从源码的角度深度剖析了 AQS 独占锁模式下的获取锁与释放锁的逻辑,如果你把这部分搞明白了,再看共享锁的实现原理,思路就会清晰很多。下面我们继续从源码中窥探共享锁的实现原理。
156 0
Java并发之AQS源码分析(二)
彻底搞懂AQS
AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
彻底搞懂AQS