我想知道兩個方案在多線程環境中是否等價。內在和外在全局鎖定的Java等價
private final Lock globalLock = new ReentrantLock();
方案1
public void addListener(Listener listener) {
globalLock.lock();
try{
//blah blah
}finally {
globalLock.unlock();
}
}
public void removeListener(Listener listener) {
globalLock.lock();
try{
//blah blah
}finally {
globalLock.unlock();
}
}
方案2
public synchronized addListener(Listener listener) {
}
public synchronized removeListener(Listener listener) {
}
我認爲第一種情形在多線程環境中的競爭條件,因爲如果線程A調用addListener()方法以前主題B調用removeListener(),即使線程A invo,線程B仍然可能在線程A之前獲取鎖線程B調用removeListener()之前的ked addListener()。這個假設是否正確,或者Java保證在線程調度之前至少執行一個方法的語句。
是,globalLock是一個全球性的最終場 –
您所描述的情況是不是競爭狀態。調用addListener和removeListener不能從「之前」或「之後」的角度考慮。 –