Zdarza się relacje z polami lotnymi i zsynchronizowanymi blokami w Javie - i ich wpływ na zmienne nieulotne?
Nadal jestem całkiem nowy w koncepcji wątkowania i próbuję zrozumieć więcej na ten temat. Niedawno natknąłem się na wpis na bloguCo lotne środki w Javie Jeremy Manson, gdzie pisze:
Kiedy jeden wątek zapisuje zmienną zmienną, a inny wątek to pisze, pierwszy wątek mówi drugiemuwszystko zawartości pamięci aż do wykonania zapisu do tej zmiennej lotnej. [...]wszystko zawartości pamięci widzianej przez wątek 1, zanim do niej napisano[volatile] ready
, musi być widoczny dla wątku 2, po odczytaniu wartościtrue
dlaready
. [podkreślenie dodane przeze mnie]
Czy to oznacza, że wszystkie zmienne (zmienne lub nie) przechowywane w pamięci Wątku 1 w czasie zapisu do zmiennej lotnej staną się widoczne dla Wątku 2 po odczytaniu tej zmiennej lotnej? W takim razie,czy można złożyć to stwierdzenie z oficjalnej dokumentacji Java / źródeł Oracle? A z której wersji Java będzie działać?
W szczególności, jeśli wszystkie wątki mają następujące zmienne klasowe:
private String s = "running";
private volatile boolean b = false;
Wątek 1 wykonuje najpierw:
s = "done";
b = true;
Następnie wątek 2 wykonuje się później (po napisaniu wątku 1 do pola zmiennego):
boolean flag = b; //read from volatile
System.out.println(s);
Czy byłoby zagwarantowane wydrukowanie „zrobione”?
Co by się stało, gdyby zamiast oświadczeniab
tak jakvolatile
Położyłem napis i przeczytałemsynchronized
blok?
Dodatkowo w dyskusji zatytułowanej „Czy zmienne statyczne są dzielone między wątki?„, @TREEpisze:
Nie używaj lotnych, aby chronić więcej niż jeden stan współdzielony.
Czemu? (Przepraszam, nie mogę jeszcze komentować innych pytań, bo inaczej zapytałbym ...)