2011-12-14 15 views
6

Chcę wiedzieć, czy tworzenie nowego wątku w Java wyzwala spłukiwanie pamięci podręcznej. Przypuśćmy, że coś jak to zrobić, w tej kolejności:Czy tworzenie nowego wątku ma efekt uboczny opróżniania pamięci podręcznej?

  1. uruchamiany jest wątek i ustawia zmienną X.
  2. Gwint tworzy nowy wątek.
  3. Nowy wątek dostępów X.

Moje pytanie jest takie: czy nowy wątek, albo w momencie jego tworzenia lub w momencie rozpoczyna wykonanie, na pewno zobaczyć aktualizację wykonaną przez X stary wątek w kroku 1? Rozumiem, że jeśli stary wątek zmieni wartość X w przyszłości, nie ma gwarancji, że nowy wątek zobaczy te zmiany. W porządku. Chcę tylko wiedzieć, czy nowy wątek zobaczy właściwe wartości, gdy się uruchomi, bez potrzeby jawnej synchronizacji.

Kiedy po raz pierwszy zdecydowałem się zajrzeć do tego tematu, myślałem, że proste wyszukiwanie google natychmiast ujawni odpowiedź, ale z jakiegoś powodu nie mogę znaleźć żadnego wyniku, który rozwiązuje to pytanie.

+3

Dlaczego polegać na takich niejasnych gwarancje (o ile takie istnieją w wszystko) jeśli możesz po prostu zmienić zmienną "volatile"? – delnan

+5

@delnan: tutaj nie ma nic niejasnego. To zachowanie jest wyraźnie określone w specyfikacji języka Java. –

+0

Teraz bardziej niejasnym pytaniem o gwarancję może być: "Zapisuje X, B stworzony, C czyta X" - czy zachowanie tego jest zdefiniowane? :-) –

Odpowiedz

9

Tak, jest.

W języku java istnieje relacja 'happens-before', która określa, jakie efekty pamięci są widoczne między dwiema operacjami. Jeśli "A zdarza się - przed B", wówczas akcja B ma zagwarantowane widzenie wszystkich zmian wykonanych przez akcję A.

Uruchamianie wątku tworzy relację "dzieje się przed" między wywołaniem "thread.start()" i wszystkimi kodami, które wykonuje się na nowym wątku. Dlatego nowy wątek gwarantuje efekt pamięciowy polegający na zmianie zmiennej X na pierwszym wątku.

Aby uzyskać szybki przegląd relacji pojawia się przed, zobacz Memory Visibility część przeglądu pakietu java.util.concurrent. W twoim przypadku interesujące bity to:

  • Każde działanie w wątku ma miejsce - przed każdą akcją w tym wątku, która pojawia się później w kolejności programu.
  • Występuje wezwanie do rozpoczęcia wątku - przed jakimkolwiek działaniem w uruchomionym wątku.

Więcej linków jeśli jesteś ciekaw:

+0

Dobra odpowiedź, jednak przeczytanie tego streszczenia sprawia, że ​​nie jest dla mnie jasne, czy jest to zdefiniowane: istnieją wątki, "A, B, zmienna X jest nieznana". 'A pisze X; B tworzy C; C oznacza X'. Zauważ, że 'C' został stworzony przez' B', a nie 'A' - tak więc nie ma żadnych zdarzeń z A i C? (Proszę zauważyć, że to nie jest * to, co pierwotne pytanie pyta, na które pytanie odpowiada, po prostu musing! :-) –

+0

@pst: tak, masz rację. W tym przypadku nie ma żadnych zdarzeń pomiędzy akcjami "Zapisuje X" i "C czyta X". –

+0

@ PeterŠtibraný: masz na myśli to, że zdarzyło się wcześniej - pomiędzy "B tworzy C" i "C czyta X", ale nie pomiędzy "A pisze X" i jakąkolwiek inną akcję w B lub C. – ninjalj

Powiązane problemy