首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java AQS如何支持不公平的锁?

java AQS如何支持不公平的锁?
EN

Stack Overflow用户
提问于 2020-11-03 08:51:06
回答 1查看 148关注 0票数 2

在AQS的描述中,第一行是

提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关的同步器(信号量、事件等)。

由于AQS是基于FIFO等待队列的,所以我认为自然是公平的。但是在SamephoreReentrantLock等许多地方的实施中,存在着公平和不公平的AQS版本。

所以我想知道AQS是如何支持不公平锁的。

值得一提的是,我在医生里找到了那些台词。但我不明白。线程如何在已经处于队列中的其他线程之前执行任务?

即使这个类是基于内部FIFO队列的,它也不会自动执行>FIFO获取策略。排他性同步的核心形式如下:

获取: while (!tryAcquire(arg)) {队列线程(如果没有排队);可能阻塞当前线程;}

释放: if (tryRelease(arg))解除阻塞第一个排队线程;

(共享模式类似,但可能涉及级联信号。)由于在获取中的签入是在排队前调用的,因此新获取的线程可能会在阻塞和排队的其他线程之前中断。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 08:57:25

How does a thread barge ahead of others which are already in the queue?

在不公平模式下,新线程将尝试先获取锁。如果失败,它将被插入到队列中。

示例:

  1. Thread1持有锁;

  1. Thread2在队列中等待;

  1. Thread1释放锁;

  1. 几乎在同一时间,Thread3试图撬开锁。在不公平模式下运行时,允许Thread3在通知Thread2之前获得锁。但是在公平的模式下,Thread3是不被允许的。--

  1. Thread3释放锁;

  1. Thread2获得锁;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64659499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档