ジョブを処理するためのワーカー スレッドを持つ 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 つのスレッド (Gather-thread) だけがセットを読み取るため、競合状態は発生しないため、ここでは同期は必要ありませんitems
。AFAICS、セットはスレッドセーフではないため、Gather-thread はすべてのアイテムを表示しない場合がありますよね?
passToGatherThread
たとえば、サードパーティのライブラリであるため、同期できないとします。私が基本的に恐れているのは、キャッシングや VM の最適化などのために、収集スレッドがすべてのアイテムを認識していないことです。ここで問題が発生します。収集スレッドが「認識」するように、アイテム セットをスレッドセーフな方法で渡す方法適切なアイテムのセット?