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 ...)

questionAnswers(3)

yourAnswerToTheQuestion