2017-08-03 61 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,自旋鎖等公平是真的昂貴而很少使用(至少我迄今爲止沒有這種情況)。