0

私はJavaのスレッドをいじって頭を悩ませていましたが(そうするのが最善の方法のようです)、synchronize、wait()、notify()で何が起こっているのかを理解しました。

一度に2つのリソースでwait()を実行する方法があるかどうか知りたいです。以下は、私が考えていることを完全には実行しないと思います(編集通常のwhileループは、2つのリソースを解放することに集中するために、この例から除外されていることに注意してください):

synchronized(token1) {
    synchronized(token2) {
        token1.wait();
        token2.wait(); //won't run until token1 is returned
        System.out.println("I got both tokens back");
    }
}

この(非常に工夫された)場合、token2はtoken1が返されるまで保持され、token1はtoken2が返されるまで保持されます。目標は、token1とtoken2の両方を解放し、両方が使用可能になったら再開することです(token1.wait()を内部同期ループの外に移動することは私が得ているものではないことに注意してください)。

両方が利用可能かどうかをチェックするループは、この動作を実現するためにより適切かもしれませんが(これは、ダブルチェックロックのアイデアに近づいていますか?)、余分なリソースを消費します-これは単なる解決策であるため、私は決定的な解決策を求めていません私の好奇心を満たすために。

編集議論のために、ここでの2つのトークンは、スレッドが同時に使用する必要がある2つの異なるリソースを表し、他のいくつかのスレッドは両方を同時に必要とするということを言いましょう。

4

2 に答える 2

2

いいえ、標準のJavaロックではありません。私はあなたがそのようなロックを構築することができると思いますが。

waitwhileループ内で呼び出す必要があります(wait誤ってウェイクアップする可能性があり、ほとんどの場合、とにかくループが必要になります)。したがって、ある種のフラグの方が理にかなっています。

于 2010-06-16T23:52:50.230 に答える
2

この例には、待機が実行される条件は含まれていません。通常、待機は条件が満たされるまでのみ発生します。一般に、単一のロック/待機を持ち、「token1とtoken2」を条件付きロジックに抽象化することで、あなたがしようとしていることを達成できると思います。

例えば

synchronized(object) {
   while ((!token1ConditionMet) && (!token2ConditionMet)) {
       wait();
   }
} 
于 2010-06-16T23:54:24.687 に答える