Ich habe eine Java-Anwendung, die Worker-Threads hat, um Jobs zu verarbeiten. Ein Arbeiter erzeugt ein Ergebnisobjekt, so etwas sagen wie:Java Thread-sichere Übergabe von Sammlungsobjekten von einem Thread zum anderen
class WorkerResult{
private final Set<ResultItems> items;
public Worker(Set<ResultItems> pItems){
items = pItems;
}
}
Wenn der Arbeiter beendet, es tut diese Operation:
...
final Set<ResultItems> items = new SomeNonThreadSafeSetImplSet<ResultItems>();
for(Item producedItem : ...){
items.add(item);
}
passToGatherThread(items);
Der items
Satz ist eine Art "unit-of-Arbeit" hier . Die Methode passToGatherThread
übergibt die items
-Gruppe an einen Sammel-Thread, von dem zur Laufzeit nur einer existiert.
Synchronisation ist hier nicht erforderlich, da Race-Bedingungen nicht auftreten können, weil nur ein Thread (Gather-Thread) den items
-Satz liest. AFAICS, der Gather-Thread sieht möglicherweise nicht alle Elemente, weil das Set nicht Thread-sicher ist, oder?
Angenommen, ich kann passToGatherThread
nicht synchronisieren, sagen, weil es eine 3rd-Party-Bibliothek ist. Was ich grundsätzlich befürchte ist, dass der Sammel-Thread nicht alle Elemente wegen Caching, VM-Optimierungen, etc. sieht. Hier kommt die Frage: Wie man die Elemente thread-sicher weitergibt, so dass der Gather-Thread "sieht" die richtige Menge von Gegenständen?
Ich bin mir nicht sicher, aber vielleicht [PipedStreams] (http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html) kann Ihnen helfen? – oliholz
Was ist die Definition von "passToGatherhthread"? Ich denke, dies ist entscheidend für das Verständnis, ob die unten angegebenen Antworten richtig sind. Wie genau werden Items an den Sammel-Thread übergeben? –
Haben Sie wirklich Probleme mit der Sichtbarkeit der Objekte oder vermuten Sie nur ein solches Verhalten? Ihre Sorgen erscheinen unter diesen Umständen ziemlich weit hergeholt. – Dariusz