3

LinkedListの要素を複数のスレッドで反復処理したいと思います。LinkedListに書き込む必要はありません。安全ですか?または、同期リストを機能させるために必要ですか?

ありがとうございました!

4

2 に答える 2

8

彼らはこれを安全に行うことができます。

  • それらは、反復を開始する前にリストを書き込んだスレッド(すべて)と同期し、
  • 反復中にリストを変更するスレッドはありません。

開始する前に適切な同期がない限り、「書き込み」スレッドの1つがローカルキャッシュメモリまたはレジスタのリストデータ構造の変更をフラッシュしていないか、読み取りスレッドの1つが変更を行っている可能性があるため、最初のポイントが必要です。キャッシュまたはレジスタ内の古いリストの状態。

(これは、シナリオが本当にスレッドセーフであるかどうかを知るためにJavaメモリモデルをしっかりと理解する必要がある場合の1つです。)


または、同期リストを機能させるために必要ですか?

必ずしもそこまで行く必要はありません。あなたがする必要があるのは、適切な時点で「発生前」の関係があることを確認することだけであり、それを達成するためのさまざまな方法があります。たとえば、リストがライタースレッドによって作成および書き込まれ、ライターがリストをリーダースレッドオブジェクトに渡してから、start()それらを呼び出す場合です。

于 2012-07-25T23:10:32.030 に答える
-1

Javaドキュメントから:

この実装は同期されていないことに注意してください。複数のスレッドがリンクリストに同時にアクセスし、少なくとも1つのスレッドがリストを構造的に変更する場合は、外部で同期する必要があります。(構造変更とは、1つ以上の要素を追加または削除する操作です。要素の値を設定するだけでは、構造変更にはなりません。)これは通常、リストを自然にカプセル化するオブジェクトで同期することによって実現されます。そのようなオブジェクトが存在しない場合は、コレクションを使用してリストを「ラップ」する必要があります。

言い換えれば、あなたが本当にただ繰り返しているなら、あなたは大丈夫です、ただ注意してください。

于 2012-07-25T23:10:25.613 に答える