2

これが以前に尋ねられた場合は申し訳ありませんが、正確なシナリオを見つけることができませんでした.

現在、リストに要素を追加し、数分ごとに古いデータを削除するバックグラウンド スレッドがあります。理論的には、リストには一度に最大 2 つのアイテムを含めることができ、アイテムは不変です。また、必要なときにリストの最初の要素を取得する複数のスレッドもあります。このシナリオでは、リストで操作を明示的にシリアル化する必要がありますか? 要素への参照を取得しているだけなので、バックグラウンド スレッドがリストから要素を削除しても、削除前にスレッドが既に参照のコピーを取得しているため、問題にはならないはずです。これを行うには、おそらくもっと良い方法があります。ありがとうございます。

4

1 に答える 1

1

はい、追加と削除はアトミック操作ではないため、ここでも同期が必要です。あるスレッドが を呼び出しadd(0, new Object())、同時に別のスレッドが を呼び出した場合remove(0)、結果は未定義です。たとえば、remove()効果がなくなる可能性があります。

使い方によっては、 のような非ブロッキング リスト クラスを使用できる場合がありますConcurrentLinkedQueue。ただし、数分ごとに 1 つの変更をプッシュしていることを考えると、同期を回避することでパフォーマンスが大幅に向上しているとは思えません。

于 2012-04-10T22:36:04.433 に答える