マルチスレッド環境で 2 つのシナリオが同等かどうかを知りたいです。
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 ) {
}
スレッド B が removeListener() を呼び出す前にスレッド A が addListener() メソッドを呼び出すと、スレッド A が addListener を呼び出したとしても、スレッド B がスレッド A の前にロックを取得する可能性があるため、最初のシナリオにはマルチスレッド環境で競合状態があると思います。 () スレッド B が removeListener() を呼び出す前。この仮説は正しいですか、それとも Java は、スレッドがスケジュールされる前にメソッドの少なくとも 1 つのステートメントが実行されることを保証します。