java中acquire()_Java高并发系列之AQS中acquire源码解析

本文详细解读了AQS的acquire方法,包括addWaiter、acquireQueued、shouldParkAfterFailedAcquire和parkAndCheckInterrupt等关键步骤。通过分析源码,阐述了节点入队、线程挂起与唤醒的机制,帮助理解Java并发编程中的AQS工作原理。
摘要由CSDN通过智能技术生成

我们知道,AQS中最重要的两个方法就是acquire和release方法。我们本文来走读走读acquire的源码。

4b96d07463c906bb2c17ce497bb5a2c9.png

首先,tryAcquire是需要子类具体去实现,其作用就是设置state的值,如果设置成功,就代表获取资源,否则会进入下面的流程,也就是将当前线程封装到阻塞队列。

下面先来分析addWaiter方法。我们进入addWaiter方法看看。

76be346bcd62958d830b5d1202cbf333.png

1、首先,创建一个Node节点,我们知道这个Node节点是AQS的一个内部类。也是AQS阻塞队列(注:AQS阻塞队列是基于双向链表实现的)的基本类型,你可以想象成链表的Node节点。

2、由于AQS插入的顺序是在尾节点tail插入元素,取元素是在head节点进行。AQS初始化的时候,head和tail都指向null。因此这里Node pred首先指向尾节点。如果尾节点不为空则将当前创建的node节点前驱节点设置为pred。然后调用compareAndSetTail这个CAS操作将当前创建的node设置为tail节点,如果设置成功则将之前尾节点的pred后驱节点指向node。这里也就是说将新创建的node设置为新的tail节点,同时设置链表的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值