Próbuję zrozumieć, jak wielowątkowość działa w Javie. Rozumiem różnicę między Volatile
i Synchronization
.Wątki Java: czy wszystkie zmienne współdzielone powinny być zmienne?
Volatile
dotyczy widoczności i nie gwarantuje synchronizacji. Kiedy pracujemy w środowiskach wielowątkowych, każdy wątek tworzy własną kopię na lokalnym buforze podręcznym zmiennej, z którą mają do czynienia. Gdy ta wartość jest aktualizowana, aktualizacja odbywa się najpierw w lokalnej kopii pamięci podręcznej, a nie w rzeczywistej zmiennej. Dlatego też inne wątki są agnostyczne w odniesieniu do wartości, które zmieniają inne wątki. I tu pojawia się volatile
. Pola zmienne są natychmiast zapisywane w pamięci głównej, a odczyty pochodzą z pamięci głównej.
Fragment z Thinking In Java
-
Synchronizacja także powoduje spłukiwania do pamięci głównej, więc jeśli pole jest całkowicie strzeżona przez zsynchronizowanych metod lub bloków, nie jest konieczne, aby to niestabilne.
Zwykle bezpieczne jest używanie lotnych zamiast zsynchronizowanych jeśli klasa ma tylko jedno zmienne pole. Znowu, twój pierwszy wybór powinien być być używać zsynchronizowanego słowa kluczowego - to jest najbezpieczniejsze podejście, i próbuje zrobić cokolwiek innego jest ryzykowne.
Ale moje pytanie brzmi: jeśli w bloku zsynchronizowanym modyfikowana jest nielotna zmienna dzielona, czy pozostałe wątki zobaczą zaktualizowane dane? (Ponieważ zmienna w pytaniu nieulotne, inne wątki powinien przeczytać nieświeże dane z pamięci podręcznej zamiast głównej pamięci głównej)
Jeżeli odpowiedź na powyższe pytanie jest NO
, to mogę stwierdzić, że za każdym razem używam synchronizację, że powinienem upewnić się, że wspólne zmienne muszą być oznaczone jako volatile
?
A jeśli odpowiedź brzmi: YES
, to czy oznacza to, że zawsze mogę użyć synchronization
zamiast oznaczania wspólnych zmiennych to volatile
?
p.s: Przed zadaniem tego pytania przeczytałem wiele odpowiedzi na temat StackOverflow i na innych stronach, ale nie mogłem znaleźć odpowiedzi na moje pytanie.
@Sotirios: Jestem przekonany, że moje pytanie nie jest duplikatem to: https://stackoverflow.com/questions/3214938/java-volatile-modifier-and-synchronized-blocks Szukałem czegoś więcej niż różnica między lotnością a synchronizacją. W każdym razie dzięki za link, przeczytam odpowiedzi. –
Co _ różnica? Zapytałeś, czy musisz oznaczyć zmienną jako 'volatile', jeśli tylko uzyskujesz dostęp do niej przez blok' synchronized'. Odpowiedzi w tym pytaniu dotyczą tego. –