5

配列要素はワーカー間で正しく公開されていますか?

大きな配列があるとします (任意のアトミック データ型であるため、longorではありませんdouble)。

  • コンストラクターに渡す配列を埋めるワーカーを作成し、
  • ワーカーをエグゼキューターに送信し、完了するまで待ちます (例:future.get() )。ワーカーは何も返しません。それは私の配列を埋めるだけです。
  • 次に、コンストラクターに同じ配列を持つ別のワーカーをすぐに作成して送信します。最新の値が表示されますか?

言い換えれば、前のワーカーの最後の書き込みが、次のワーカーの最初の読み取りの前に発生することが保証されていますか?

参照が既に持っているものと同じであっても、代わりに(またはベストプラクティスなどのために)最初のワーカーに配列を返させる必要がありますか?

[編集] いくつかの背景: 私はbyte配列またはshort配列のいずれかを使用します。これらは画像を表し、それぞれ最大 5 億個の要素を使用します。各要素に対して簡単な計算を実行します。

4

2 に答える 2

3

パッケージ java.util.concurrent JavaDocから:

java.util.concurrent とそのサブパッケージのすべてのクラスのメソッドは、これらの保証をより高いレベルの同期に拡張します。特に:

Future によって表される非同期計算によって実行されるアクションは、別のスレッドで Future.get() を介して結果を取得した後に発生するアクションの前に発生します。

Runnable を Executor に送信する前のスレッド内のアクションは、その実行が開始される前に発生します。ExecutorService に送信された Callable についても同様です。

それによると、シナリオで 2 番目のワーカーから配列にアクセスすることはかなり安全なようです。

于 2015-08-31T19:05:16.467 に答える
2

配列の要素はvolatileではないため、CPU によってスレッドごとにキャッシュされる可能性があります。したがって、最初のワーカーがいくつかの配列要素を初期化する可能性がありますが、2 番目のワーカーはキャッシュのためにそれを認識できません。

配列要素自体がアトミックであることを確認するには、AtomicReferenceArrayを使用できます。

于 2015-08-22T13:56:11.360 に答える