当一个线程暂停保留锁而另一个线程在 await() 中时调用 signal() 谁将进入 CS?



假设有 3 个线程 t1、t2、t3

我有这个代码(Condition con = lock.newCondition();(:

lock.lock();
if (Thread.currentThread().getName().equals("t1"))
con.await();
if (Thread.currentThread().getName().equals("t2"))
con.signal(); 
lock.unlock(); 

T1 首先运行此代码,然后 T2 和 T3 在lock.lock();中挂起。
t1 执行后con.await();t2 进入并执行con.signal();

我的问题是信号发出后谁将进入关键部分?
是 t1 因为 await(( 而暂停还是 t3 在lock.lock();中暂停?

预言机文档指出:

如果有任何线程正在等待此条件,则选择一个线程 醒来。然后,该线程必须在返回之前重新获取锁 从等待。

从最后一句话来看,这是否意味着 t1 唤醒后它与锁上的 t3 竞争?
如果是这样,是否可以保证 t1、t3 中的谁会进入? 假设我没有在 lock 的构造函数中传递 true(表示公平锁(。

是的,你是对的 - 如果不公平,绝对不能保证会选择哪个线程 -t1t3; 他们确实会争夺资源。

顺便说一句,不仅在这里如此,线程调度通常也是如此 - 无论是同步块、CAS、自旋锁等。 公平性真的很昂贵,很少使用(至少到目前为止我没有理由(。

最新更新