Ho un'applicazione Java che ha thread di lavoro per elaborare i lavori. Un lavoratore produce un oggetto risultato, dire qualcosa del tipo:Passaggio in thread-safe Java di oggetti di raccolta da un thread a un altro
class WorkerResult{
private final Set<ResultItems> items;
public Worker(Set<ResultItems> pItems){
items = pItems;
}
}
Quando il lavoratore finisce, lo fa questa operazione:
...
final Set<ResultItems> items = new SomeNonThreadSafeSetImplSet<ResultItems>();
for(Item producedItem : ...){
items.add(item);
}
passToGatherThread(items);
Il set items
è una specie di "lavoro di unità di" qui . Il metodo passToGatherThread
passa lo items
impostato su un thread di raccolta, di cui solo uno esiste in fase di esecuzione.
Qui la sincronizzazione non è necessaria qui, poiché le condizioni di gara non possono verificarsi perché solo un thread (Gather-thread) legge il set items
. AFAICS, il gather-thread potrebbe non vedere tutti gli elementi perché il set non è thread-safe, giusto?
Suppongo di non riuscire a sincronizzare passToGatherThread
, perché è una libreria di terze parti. Quello che temo fondamentalmente è che il thread di raccolta non veda tutti gli elementi a causa del caching, le ottimizzazioni della VM, ecc. Ecco quindi la domanda: come passare gli elementi impostati in modo thread-safe, in modo che il thread di Gather "veda" l'insieme corretto di elementi?
Non sono sicuro, ma forse [PipedStreams] (http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html) può aiutarti? – oliholz
Qual è la definizione di 'passToGatherthread'? Penso che questo sia cruciale per capire se le risposte fornite di seguito sono corrette. In che modo esattamente gli oggetti vengono passati al thread di raccolta? –
Hai davvero problemi con la visibilità degli oggetti o sospetti solo un simile comportamento? Le tue preoccupazioni sembrano piuttosto inverosimili in quelle circostanze. – Dariusz