在AQS的描述中,第一行是
提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关的同步器(信号量、事件等)。
由于AQS是基于FIFO等待队列的,所以我认为自然是公平的。但是在Samephore和ReentrantLock等许多地方的实施中,存在着公平和不公平的AQS版本。
所以我想知道AQS是如何支持不公平锁的。
值得一提的是,我在医生里找到了那些台词。但我不明白。线程如何在已经处于队列中的其他线程之前执行任务?
即使这个类是基于内部FIFO队列的,它也不会自动执行>FIFO获取策略。排他性同步的核心形式如下:
获取: while (!tryAcquire(arg)) {队列线程(如果没有排队);可能阻塞当前线程;}
释放: if (tryRelease(arg))解除阻塞第一个排队线程;
(共享模式类似,但可能涉及级联信号。)由于在获取中的签入是在排队前调用的,因此新获取的线程可能会在阻塞和排队的其他线程之前中断。
发布于 2020-11-03 08:57:25
How does a thread barge ahead of others which are already in the queue?
在不公平模式下,新线程将尝试先获取锁。如果失败,它将被插入到队列中。
示例:
https://stackoverflow.com/questions/64659499
复制相似问题