0

私は自分自身の非常に基本的なセマフォの実装をいじってみましたが、選択した実装がデッドロックを取得するかどうかに影響することに気づきました。しかし、デッドロックがどのように発生しているのかわかりません。

私の元の実装(デッドロックなし):

public synchronized void waitFor(){
    value--;
    if(value < 0)
    wait();
}

public synchronized void signal(){
    value++;
    notify();
}

後の実装(デッドロックが発生します):

public synchronized void waitFor(){
    value--;
    while(value < 0)
        wait();
}

public synchronized void signal(){
    value++;
    notifyAll();
}

wait()は、スレッドの中断をキャッチするための両方のコードセットで実際にはtry-catchに囲まれていますが、読みやすくするために省略しており、デッドロックの問題に違いはないと想定しています。

誰かアイデアはありますか?

4

2 に答える 2

0

2 番目の実装では、デッドロックのリスクを見つけることができません。while ループは、ロックを待機するための正しい選択です ( Object.wait() ドキュメントの偽のウェイクアップを参照してください)。

また、シグナル操作も見逃せないようです。シグナルは、別のスレッドが待機状態にある場合、または他のスレッドが waitFor() を実行していない場合にのみ発生します。

したがって、コードの他の部分を確認することをお勧めします。

  • すべてのスレッドがセマフォの同じインスタンスで同期しますか?
  • スレッドセーフでない方法で、値カウンターが他の場所で使用されていないことを確認しますか?
  • すべてのスレッドは、完了時に sepmaphore.signal() を呼び出しますか? (通常、この種の解放操作は finally ブロックに配置されます)。
于 2013-03-16T14:36:30.427 に答える
-1

あなたが使用しているように

while(value < 0)
        wait();

後者の実装では、値 <0 の非終了ループ内にあり、ここで永遠にループしています。

これは、デッドロック状況のポインターである可能性があります。

于 2013-03-16T14:14:48.290 に答える