假设我有三个线程,T1, T2, T3,一个锁lock和一个Resource资源上的某个条件cond。
T1获取锁,现在由于某些条件而执行cond.await(),而T2获取该锁并执行cond.signal(),然后继续执行lock.unlock(),但在一段时间内,T3也试图获取锁,所以它处于lock.lock()行,到底发生了什么?
是T2重新获得锁,还是T3获得它,或者它是基于scheudler的随机锁?
发布于 2018-09-08 03:56:54
如果您阅读了文档,即ReentrantLock的javadoc,它在第3段中具体回答了这个问题:
这个类的构造函数
接受一个可选的公平性参数。当设置为
true时,在争用情况下,锁倾向于授予等待时间最长的线程访问权限。否则,此锁不能保证任何特定的访问顺序。
发布于 2018-09-08 15:16:55
每当发出信号时,其中一个等待线程将被移除,并被放回entry set中,这样他就可以有机会运行。在signalAll方面,所有等待线程都将从等待集中删除,并放回条目集中,以便它们有机会运行。
并且是的,调度器然后决定从项目集合中挑选哪个线程。在公平方面,等待时间最长的人将首先获得机会。
很好的解释here
https://stackoverflow.com/questions/52228864
复制相似问题