2017-08-03 55 views
1

假设有3个线程T1,T2,T3当一个线程挂起时,调用信号()将锁等锁定在等待()谁将进入CS?

我的代码(Condition con = lock.newCondition();)此pieace:

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();

我的问题是谁会在信号后进入临界区?
它会因为暂停在lock.lock();中的await()或t3而暂停吗?

神谕文档指出:

如果任何线程都在此条件下再一个就是选择 醒来等待。该线程在返回 之前必须重新获取该锁。

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

回答

1

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

而且顺便说一句是这样的话,不仅在这里,它是一般用于线程调度的情况 - 或者是synchronized块,CAS,自旋锁等公平是真的昂贵而很少使用(至少我迄今为止没有这种情况)。