2016-04-14 9 views
2

この質問は、マルチスレッドのJavaプログラム内で配列内容を安全に公開することに関係しています。安全に配列要素を公開する

のは、私はオブジェクトのいくつかの任意の配列を持っていると仮定しましょう:

Object[] myArray = ... 

今、この配列は、多分このように、別のスレッドに引き渡されます。

new Thread() { 
    public void run() { 
     // ... 
     Object o = myArray[0]; 
     // ... 
    } 
}; 

私の質問は、新しいスレッドが意志でありますそれ以上の同期が行われていない場合は、アレイ内の値を「期待値」として観察します。これは、配列自体が(最終的な/揮発性の)フィールドであるか、ローカル変数であるかによって異なりますか?最初のスレッドからの配列の後続の変更は、新しいスレッドにすぐに見えますか? 配列の要素を安全にパブリッシュする最も効率的な方法は何でしょうか?

+1

はい、 'Thread'をyesにしていないためです。 'start'はbefore-beforeを設定します。 – Savior

+1

このような配列を共有することは非常に悪い考えです。あなたがそれを読んでほしいという理由だけで、他の観察者が突然修飾語になるかもしれないというわけではありません。スレッド間でデータを共有するためのより良いパターンがあります – ControlAltDel

+0

私の場合、AOPの 'MethodInvocation'(メソッド呼び出しを傍受して得たもの)を渡して別のスレッドで実行させています。それによって私は議論の配列を引き渡す。私は次に、異なる糸の中で傍受された方法で単純に「進行する」ことの意味がどんなものかと疑問に思った。 – SimonT

答えて

0

正確な答えは、あなたの唯一のオプションなど、配列(およびないスレッドセーフCollection同じ要素の)を使用しているかどうか、アレイとその内容、作家と読者の数の可変性に依存

私が靴を履いていたなら、おそらく夜間をStackOverflowで検索し、いくつかの模様の組み合わせを試してみよう(多分final配列リファレンスと配列要素の不変ラッパー、またはUnsafe.putOrderedObject 1人の作家)。

その後、私は "Playground"フォルダにすべてをコピーし、AtomicReferenceArrayまたはCopyOnWriteArrayList(または別の適切な既製のソリューション)を使用します。

大きな問題(正解など)をすべて解決したときにパフォーマンスを心配する必要があることを覚えようとしています。このプログラムの特定の部分が必要です最適化する。うまくいけば同様のアプローチもあなたのために働くでしょう。

関連する問題