信号是否保证到达线程?

假设我有三个线程,T1, T2, T3一个锁lockcond一个Resource资源上的一些条件。

T1获得锁,现在cond.await()由于某些条件而T2获得该锁,cond.signal()然后继续执行lock.unlock(),但有一段时间,T3也试图获得锁,所以它位于 的行lock.lock(),究竟发生了什么?

T2重新获得锁还是获得了锁,还是T3基于 scheudler 是随机的?


慕容708150
浏览 175回答 2
2回答

白衣非少年

每当发出信号时,其中一个等待线程将被删除并放回入口集中,以便他有机会运行。就 signalAll 而言,所有等待线程将从等待集中移除并放回入口集中,以便它们有机会运行。是的,调度程序然后决定从条目集中选择哪个线程。在公平方面,等待时间最长的人将首先获得机会。很好的解释在这里

杨__羊羊

如果您阅读了文档,即 的 javadoc ReentrantLock,它会在第 3 段中专门回答这个问题:此类的构造函数接受一个可选的公平参数。当 set 时true,在争用情况下,锁倾向于授予对等待时间最长的线程的访问权限。否则这个锁不能保证任何特定的访问顺序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java