私は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つの異なるリソースを表し、他のいくつかのスレッドは両方を同時に必要とするということを言いましょう。