ジョブを処理するワーカースレッドを持つJavaアプリケーションがあります。労働者は、結果オブジェクトを生成し、のようなものを言う:あるスレッドから別のスレッドにコレクションオブジェクトをJavaスレッドで安全に渡す
class WorkerResult{
private final Set<ResultItems> items;
public Worker(Set<ResultItems> pItems){
items = pItems;
}
}
作業員が終了すると、それはこの操作を行います。
...
final Set<ResultItems> items = new SomeNonThreadSafeSetImplSet<ResultItems>();
for(Item producedItem : ...){
items.add(item);
}
passToGatherThread(items);
items
セットは「作業単位」ここの一種であります。 passToGatherThread
メソッドは、items
セットを収集スレッドに渡します。そのうちの1つのみが実行時に存在します。
ここで同期化は必要ありません。これは、1つのスレッド(ギャザースレッド)のみがitems
のセットを読み取るため、競合状態が発生しないためです。 AFAICSでは、ギャザースレッドは、スレッドセーフではないため、すべてのアイテムを表示しない場合があります。
passToGatherThread
は、サードパーティのライブラリであるため、同期させることはできません。私は基本的に恐れているのは、キャッシング、VMの最適化などのために、ギャザースレッドがすべてのアイテムを見ることができないということです。ここでは、スレッドセーフな方法でアイテムを渡す方法です。ギャザースレッドは、適切な項目のセット?
[PipedStreams](http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html)がお手伝いできますか? – oliholz
'passToGatherthread'の定義は何ですか?私はこれが以下の答えが正しいかどうかを理解する上で重要だと思います。 'items'はどのくらい正確にギャザースレッドに渡されますか? –
オブジェクトの可視性に本当に問題がありますか、またはそのような動作しか疑うことはありませんか?そのような状況では、あなたの懸念はかなり遠いものに見えます。 – Dariusz