2016-04-08 56 views
1

我有兩個方法都運行不同的線程,其中一個方法我不想運行時,另一個已被調用。這是我選擇在我的其他的方法來使用鎖ReentrantLock - 這是一個有效的方法來使用它

@Override 
public synchronized void doSomething(int[] params) 
{ 
    while (lock.isLocked()) 
    { 
     // wait for it to become unlocked 
    } 

    //lock is released so lets do some stuff 

我有以下實施

@Override 
public void doSomethingElse(int param) 
{ 
    lock.lock(); 
    for (int i = 0 ; i < param; i++) 
    { 
     //do some stuff 
    } 
    lock.unlock(); 
} 

的原因是while循環的說法正確的方法,我想這個線程等待在這裏,直到鎖被釋放還是有實現這個

感謝

回答

2

的更好的方法,而循環就忙等待,這是肯定的東西你不婉要做。 調用lock.lock();將會阻塞,直到鎖定被釋放,所以它是正確的方式來做到這一點,就像您在其他方法中一樣。

您也不需要第一種方法是​​,並且始終應該在finally子句中釋放鎖定。

2

你需要的東西是這樣的:

private void method1() 
{ 
    lock.lock(); 
    try { 
     ... 
    } finally { 
     lock.unlock(); 
    } 
} 

private void method2() 
{ 
    lock.lock(); 
    try { 
     ... 
    } finally { 
     lock.unlock(); 
    } 
} 

不要forgeet使用try {}最後{}或者你可以使用僵局告終。

0

兩者都不對,標準做法是在finally子句中解鎖。否則,如果在應用鎖的代碼內部拋出異常,則應用程序將停止運行:

public void doSomethingElse(int param) throws Exception { 
    lock.lock(); 
    try { 
     //do some stuff that may throw exceptions 
    } finally { 
     lock.unlock(); 
    } 
} 
相關問題