假设我有三个线程,T1, T2, T3
,一个锁lock
和一个cond
资源上的条件Resource
。
T1
获得了锁定,现在由于某种条件而获得了cond.await()
,而T2
获得了该锁定并得到了cond.signal()
,然后继续进行了lock.unlock()
,但是有一阵子,T3
也在尝试获取锁,所以它位于lock.lock()
的行上,究竟发生了什么?
T2
是否重新获得锁,或者T3
是否获得了锁,或者它是基于scheudler随机生成的?
答案 0 :(得分:0)
如果您阅读了文档,即ReentrantLock
的javadoc,它将在第3段中专门回答此问题:
此类的构造函数接受一个可选的 fairness 参数。设置
true
时,在争用下,锁倾向于授予对等待时间最长的线程的访问。否则,此锁不能保证任何特定的访问顺序。
答案 1 :(得分:0)
每当发出信号时,都会删除一个等待线程,并将其放回到条目集中,以便他有机会运行。在信号方面,所有等待线程都将从等待集中删除,然后放回到入口集中,这样它们就有机会运行。
是的,然后调度程序决定从条目集中选择哪个线程。公平地说,等待时间最长的人将首先获得机会。
好的解释here