关于AQS中队列

来源:4-10 AQS之面试官:讲讲AQS的工作原理?

慕函数6034000

2021-04-20

关于竞争的流程及队列的疑惑
1.AQS中包含两种队列 cas失败等待队列和条件等待队列,那线程竞争进入队列是竞争进入什么队列呢。
2.还是AQS中包含3个队列,除了以上两个队列,同时还包括类似Monitor的EnterSet的队列。
3.线程竞争进入的队列后是出于wait状态么,如果是处于wait状态,那是怎么被唤醒然后排队进入临界区的呢

谢谢 !

写回答

1回答

求老仙

2021-05-30

本质上是一样的,AQS和Monitor都需要两个队列。 队列的实现都是Lock Free数据结构。 主要区别在于一个是C/C++写的,一个是Java代码。 

它们都有两个队列:一个是等待执行的队列,一个是等待信号的队列。线程竞争临界区资源是线程代码决定的。失败的进入等待执行的队列;成功的,执行中途如果主动休眠等待信号,就放到等待信号的队列。每当有线程退出临界区后,等待队列中只有一个线程可以参与竞争(比如叫H)。如果追求公平,新来的线程都去排队,直接让H执行。如果不追求公平,可以让新来的线程(没有进入等待队列)和H一起竞争。

线程休眠就是停止执行,唤醒就是继续执行。因此,竞争临界区是线程自己的代码要实现的。

0
0

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程