0

マルチスレッド環境で 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 つのステートメントが実行されることを保証します。

4

3 に答える 3

1

これらは機能的に同等です (globalLockが最終インスタンス変数であると仮定します)。

最初の例では、2 つのスレッドが 2 つのメソッドを同時に呼び出すと、そのうちの 1 つだけがロックを取得でき、2 番目のスレッドは最初のスレッドがロックを解放するまで待機する必要があります。

于 2013-08-01T11:50:19.887 に答える
1

グローバルロックが何であるかは明確ではありません。インスタンスフィールドの場合

private final Lock globalLock = new ReentrantLock();

public void addListener( Listener listener ) {
    globalLock.lock();
    ...

答えはイエスです。これら 2 つのシナリオは同等です。

于 2013-08-01T11:51:21.140 に答える