ReentrantReadWriteLock を正しく実装したかどうかわからないので、何か間違っていたら教えていただければ幸いです。
シナリオ: シャツを作るのに 2 つのステップが必要であると想像してください。シャツはすべて同じものになります。
- 最初のステップでは、裁縫道具がシャツを縫う
- 2番目のステップでは、ボタンツールが最初のステップからシャツを取り、ボタンを付けます. 簡単にするために、各シャツにはボタンを 1 つだけ配置します。
ステップ 1 とステップ 2 で使用するソーイング ツールとボタン付けツールはそれぞれ合計 10 個あります。ボタンは食器棚の別の棚に保管されています。
私の目的は、スレッドが次のことをしないようにしながら、できるだけ多くの並行性を確保することです。
- 同じ棚からボタンを取る
- 同じ裁縫道具からシャツを取る
- デッドロック
そのため、次のコードへのロックを実装しました。
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();
}
質問:
secondLock を実装する必要がありますか? これは、firstLock が既にコードをロックしており、他のスレッドをブロックしているためです。
両方のロックが実際に必要であると仮定すると、同時実行性を向上させるために 2 つの ReentrantReadWriteLock オブジェクトを作成する必要があるでしょうか? このリンクから参照しました - http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
スレッドとインターリーブについて読みましたが、次のステートメントで「インターリーブ」が何を意味するのかわかりません。誰かが私にそれを素人の言葉で説明できますか?
引用: c1 の更新が c2 の更新とインターリーブされるのを防ぐ理由はありません
ソース: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
前もって感謝します!