了解 AQS 的进来讨论一下

2020-02-11 21:09:34 +08:00
 yangyuhan12138

LinkedBlockingQueue 的 poll(long timeout, TimeUnit unit)方法是否会超过指定时间返回 比如 linkedBlockingQueue.poll(1,TimeUnit.SECONDS);

我想要的结果是最多 1 秒钟没取到我就不取了 但是实际执行的结果可能是线程在这里会阻塞 1 秒多? 因为 java.util.concurrent.locks.Condition#awaitNanos 的实现方式如此

2700 次点击
所在节点    Java
23 条回复
yangyuhan12138
2020-02-13 20:44:23 +08:00
@ppyybb 在每次 submit 的时候睡一下是不科学的一是因为时间原因,每个线程都睡太耗时间了;二是因为这样也不能确保所有线程同时 take,睡了的话上一个线程反而会执行到 await 把锁释放了
ppyybb
2020-02-13 20:50:25 +08:00
@yangyuhan12138
其实这样做的目的就是不需要所有线程同时 take 啊,不发生冲突就不会有入 sync 的问题,我的原意只是让进入 sync 尽量少即可说明问题。

当然我想复杂了,因为 aqs 是两年前看的内容了,今天临时翻了下细节不熟悉,搞得我想成进入 sync 后就不会出来,忘记后面还有一个 await 会释放锁从而最终所有 node 都会出 sync 了。
yangyuhan12138
2020-02-13 20:57:51 +08:00
@ppyybb 哦哦,原来是这样,两年前的内容都还记得也是很厉害了,我是因为疫情原因,在家没事干,学习下 AQS,发现这里可能会有点问题就提出来大家一起讨论一下,也感谢大家跟我一起讨论,祝大家身体健康,工作顺利

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/643848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX