Mam aplikację Java, która ma wątki robocze do przetwarzania zadań. Pracownik produkuje obiektu wynik, powiedzieć coś w stylu:Przechodzenie obiektów kolekcji z jednego wątku do drugiego w wątku Java
class WorkerResult{
private final Set<ResultItems> items;
public Worker(Set<ResultItems> pItems){
items = pItems;
}
}
Gdy pracownik kończy, to jednak ta operacja:
...
final Set<ResultItems> items = new SomeNonThreadSafeSetImplSet<ResultItems>();
for(Item producedItem : ...){
items.add(item);
}
passToGatherThread(items);
Zestaw items
jest rodzajem "unit-of-work" tutaj . Metoda passToGatherThread
przekazuje zestaw items
do wątku gromadzenia, którego tylko jeden istnieje w środowisku wykonawczym.
Synchronizacja nie jest tu potrzebna, ponieważ warunki wyścigu nie mogą wystąpić, ponieważ tylko jeden wątek (Gather-thread) odczytuje zestaw items
. AFAICS, Gather-thread może nie widzieć wszystkich elementów, ponieważ zestaw nie jest bezpieczny dla wątków, prawda?
Załóżmy, że nie mogę zsynchronizować passToGatherThread
, powiedzmy, ponieważ jest to biblioteka innej firmy. Zasadniczo obawiam się, że wątek "gather" nie widzi wszystkich przedmiotów z powodu buforowania, optymalizacji VM itp. Pojawia się więc pytanie: jak przekazać elementy ustawione w sposób bezpieczny dla wątków, tak, że wątek Zbierz "widzi" właściwy zestaw przedmiotów?
Nie jestem pewien, ale może [PipedStreams] (http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html) może ci pomóc? – oliholz
Jaka jest definicja "passToGatherthread"? Myślę, że jest to kluczowe dla zrozumienia, czy podane poniżej odpowiedzi są poprawne. W jaki dokładnie sposób 'items' przekazywane są do wątku gather? –
Czy naprawdę masz problemy z widocznością obiektów lub czy tylko podejrzewasz takie zachowanie? Twoje obawy wydają się dość naciągane w tych okolicznościach. – Dariusz