2012-03-11 59 views

回答

4

您可以用java.util.concurrent.locks.ReentrantLock類替換​​塊。這個類提供了非常相似的互斥功能,但它也有方法tryLock,如果它是空閒的,它會獲得鎖,或者如果它被採用,則立即返回false。

所以,你可以有這樣的:

// thread 1 has normal synchronized behavior 
rlock.lock(); 
// code 
rlock.unlock(); 

和線程2:

// thread 2 will skip the code if the lock is already taken 
if(rlock.tryLock()) { 
    // code 
    rlock.unlock(); 
} 

private final ReentrantLock rlock = new ReentrantLock(); 

碼線1

2

它可以用警衛對象完成。警衛對象具有這樣的功能:

  1. 鎖定警戒對象。

  2. 檢查是否設置了警戒標誌。如果是這樣,返回false,解鎖守衛對象。

  3. 設置防護標誌。

  4. 返回true,解鎖警衛對象。

如果主叫方得到true,它知道它可以在不與任何其他線程衝突的,因爲只有一個線程可以直到它被重新設置爲falsefalse保護標誌設置爲true受保護對象進行操作,並其他線程只有在設置了防護標誌時才訪問該對象。

完成後,再鎖定在保護對象並清除保護標記,以允許在其他線程。

防護對象的鎖定可以,當然,是通過使用同步功能隱式的。通常你不會創建一個只是爲了防範的對象,而是摺疊與爲什麼需要將對象保護到守衛對象中相關的其他功能。