3

待機/通知で複数のロックを保持する方法は?

プリンターとスキャナーという 2 つのロック可能なリソースがある状況を想像してください。デッドロックに陥ったので、プリンターロックより先にスキャナーロックを取得することにした。プリンターのみが必要な場合でも、スキャナーをロックする必要があります。ここでは、1 つの (印刷) スレッドがプリンターに到達し、別の (フィード) スレッドが用紙をフィードする必要があることに気付きます。私の設計では、印刷スレッドがフィード スレッドを待機して用紙をフィードする必要があります。

プリンターで待っていると。スキャナーのロックをまだ保持していると思います。スレッド 2 はどのようにして通知コードを入力できますか?

この種の状況で機能する一般的に使用される設計は何ですか? (デッドロックを避けるために) 2 つのロックを保持する必要があるとします。両方のロックを保持した状態で待機/通知するにはどうすればよいですか? サンプルコードは以下です。

明らかな方法の 1 つは、コード全体でロック取得順序を逆にして、スキャナーを待つ必要がないようにすることです。

別の方法はありますか?

サンプルコード: 印刷スレッド:

    synchronized (scanner) {
        synchronized (printer) {
            // action
            while (trayEmpty) {
                printer.wait();
            }
        }
    }

フィード スレッドのサンプル コード:

    synchronized (scanner) {
        synchronized (printer) {
            // action
            trayEmpty=false;
            printer.notify();
        }
    }
4

2 に答える 2

1
Is there another way out?

待機/通知を使用するのではなく、Java Concurrent Api の明示的なロックを使用することlockをお勧めしunlockます。

于 2012-07-23T18:15:45.617 に答える
0

この特定のケースの 1 つのアイデアは、単一のロックを使用することです。たとえば、行/列の交点にあるオブジェクトにロック オブジェクトを作成します (たとえば、ロック オブジェクトのマトリックスを作成します)。

于 2012-07-23T18:12:03.483 に答える