信号是否保证到达螺纹?

时间:2018-09-07 19:53:29

标签: java multithreading operating-system locking

假设我有三个线程,T1, T2, T3,一个锁lock和一个cond资源上的条件Resource

T1获得了锁定,现在由于某种条件而获得了cond.await(),而T2获得了该锁定并得到了cond.signal(),然后继续进行了lock.unlock(),但是有一阵子,T3也在尝试获取锁,所以它位于lock.lock()的行上,究竟发生了什么?

T2是否重新获得锁,或者T3是否获得了锁,或者它是基于scheudler随机生成的?

2 个答案:

答案 0 :(得分:0)

如果您阅读了文档,即ReentrantLock的javadoc,它将在第3段中专门回答此问题:

  

此类的构造函数接受一个可选的 fairness 参数。设置true时,在争用下,锁倾向于授予对等待时间最长的线程的访问。否则,此锁不能保证任何特定的访问顺序。

答案 1 :(得分:0)

每当发出信号时,都会删除一个等待线程,并将其放回到条目集中,以便他有机会运行。在信号方面,所有等待线程都将从等待集中删除,然后放回到入口集中,这样它们就有机会运行。

是的,然后调度程序决定从条目集中选择哪个线程。公平地说,等待时间最长的人将首先获得机会。

好的解释here