待機/通知で複数のロックを保持する方法は?
プリンターとスキャナーという 2 つのロック可能なリソースがある状況を想像してください。デッドロックに陥ったので、プリンターロックより先にスキャナーロックを取得することにした。プリンターのみが必要な場合でも、スキャナーをロックする必要があります。ここでは、1 つの (印刷) スレッドがプリンターに到達し、別の (フィード) スレッドが用紙をフィードする必要があることに気付きます。私の設計では、印刷スレッドがフィード スレッドを待機して用紙をフィードする必要があります。
プリンターで待っていると。スキャナーのロックをまだ保持していると思います。スレッド 2 はどのようにして通知コードを入力できますか?
この種の状況で機能する一般的に使用される設計は何ですか? (デッドロックを避けるために) 2 つのロックを保持する必要があるとします。両方のロックを保持した状態で待機/通知するにはどうすればよいですか? サンプルコードは以下です。
明らかな方法の 1 つは、コード全体でロック取得順序を逆にして、スキャナーを待つ必要がないようにすることです。
別の方法はありますか?
サンプルコード: 印刷スレッド:
synchronized (scanner) {
synchronized (printer) {
// action
while (trayEmpty) {
printer.wait();
}
}
}
フィード スレッドのサンプル コード:
synchronized (scanner) {
synchronized (printer) {
// action
trayEmpty=false;
printer.notify();
}
}