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