1

ReentrantReadWriteLock を正しく実装したかどうかわからないので、何か間違っていたら教えていただければ幸いです。

シナリオ: シャツを作るのに 2 つのステップが必要であると想像してください。シャツはすべて同じものになります。

  1. 最初のステップでは、裁縫道具がシャツを縫う
  2. 2番目のステップでは、ボタンツールが最初のステップからシャツを取り、ボタンを付けます. 簡単にするために、各シャツにはボタンを 1 つだけ配置します。

ステップ 1 とステップ 2 で使用するソーイング ツールとボタン付けツールはそれぞれ合計 10 個あります。ボタンは食器棚の別の棚に保管されています。

私の目的は、スレッドが次のことをしないようにしながら、できるだけ多くの並行性を確保することです。

  1. 同じ棚からボタンを取る
  2. 同じ裁縫道具からシャツを取る
  3. デッドロック

そのため、次のコードへのロックを実装しました。

    Lock firstLock = new ReentrantReadWriteLock();
    Lock secondLock = new ReentrantReadWriteLock();

    if (buttoningTool.ready()) { //check if buttoning-tool is ready

        firstLock.writeLock();

        if (cupboard.getButton()) { //get button from any available shelf and return true if successful

            int shirtNumber = -1;

            for (tempSewingTool : allSewingTools) {

               if (tempSewingTool.shirtReady()) {

                    secondLock.writeLock();

                    shirtNumber = tempSewingTool.takeShirt();

                    secondLock.unlock();

                    break;
               }
            }

            if (shirtNumber != 1) {
                buttoningTool.activate();
            }
        }

        firstLock.unlock();
    }

質問:

  1. secondLock を実装する必要がありますか? これは、firstLock が既にコードをロックしており、他のスレッドをブロックしているためです。

  2. 両方のロックが実際に必要であると仮定すると、同時実行性を向上させるために 2 つの ReentrantReadWriteLock オブジェクトを作成する必要があるでしょうか? このリンクから参照しました - http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

  3. スレッドとインターリーブについて読みましたが、次のステートメントで「インターリーブ」が何を意味するのかわかりません。誰かが私にそれを素人の言葉で説明できますか?

引用: c1 の更新が c2 の更新とインターリーブされるのを防ぐ理由はありません

ソース: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

前もって感謝します!

4

0 に答える 0