当前位置: 首页 > news >正文

大厂面试真题-AQS中节点的入队时机有哪些

在AQS(AbstractQueuedSynchronizer)中,节点的入队操作主要发生在竞争同步状态失败时。

时机一:

在模板方法 acquire() 中,如果调用 tryAcquire(arg) 尝试成功, acquire() 将直接返回,表
示已经抢到锁;如果不成功,则开始将线程加入等待队列。
这里分为三种场景:
1 )模板方法 acquire(arg) 通过 addWaiter(Node node, int args) 方法,尝试将该节点加入到同步队
列的队尾,在存在竞争的场景时一般会成功。当然,如果加入失败,或者同步队列为空,就开始调
enq(final Node node) 自旋入队。
2 enq() 方法通过 CAS 自旋将新节点插入队列尾部。具体来说,如果 AQS 的队列非空,新节点
入队的插入位置在队列的尾部,并且是通过 CAS 方式插入的,插入之后 AQS tail 将指向新节点,
新节点作为尾节点
3 enq() 方法初始化 AQS 队列再执行 CAS 自旋。如果 AQS 的队列为空,新节点入队时首先进行
队列初始化, AQS 通过 CAS 方法创建队首节点,并且将 tail 指针指向队首节点。然后自旋,进入 CAS
自旋插入操作,直到插入成功,自旋才结束。

时机二:

Condition 等待队列上的节点被 signal() 唤醒,会通过 enq(final Node node) 自旋入队,插
AQS 的尾部。

http://www.mrgr.cn/news/49383.html

相关文章:

  • React入门 9:React Router
  • 【汇编语言】寄存器(CPU工作原理)(七)—— 查看CPU和内存,用机器指令和汇编指令编程
  • 多语言网站的设计的探索——安企CMS多语言功能的实现记录
  • Python字符串格式
  • 鸿蒙开发 三十七 ArkTs类 class
  • HAL库常用的函数:
  • oracle存储过程
  • 位定时结构
  • 面试真题 | 百度C++研发工程师面经
  • 动态规划最大子段和讲解和【题解】——最大子段和
  • springcloud之服务提供与负载均衡调用 Eureka
  • 『香驰控股』上线采购数字化平台,企企通助推农业产业化国家重点龙头提升供应链价值
  • AttributeError: ‘str‘ Object Has No Attribute ‘x‘:字符串对象没有属性x的完美解决方法
  • 【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索
  • 【C++】— 类和对象(3)
  • 麒麟系统离线安装英伟达驱动
  • ThreadLocal-共享变量
  • 【微服务】springboot远程docker进行debug调试使用详解
  • 为什么Python代码需要遵守Pythonic风格?
  • MarsCode--大数和距离【中等】