W prostych słowach,
static : static
zmienne są powiązane z klasą , a nie z dowolnym obiektem . Każde wystąpienie klasy dzieli zmienną klasy, która znajduje się w jednym ustalonym miejscu w pamięci
lotny : to słowo kluczowe dotyczy zarówno zmiennych klas, jak i instancji .
Zastosowanie zmiennych niestabilnych zmniejsza ryzyko błędów spójności pamięci, ponieważ każdy zapis do zmiennej niestabilnej ustanawia relację przed zdarzeniem z kolejnymi odczytami tej samej zmiennej. Oznacza to, że zmiany zmiennej lotnej są zawsze widoczne dla innych wątków
Przeczytaj ten artykuł , Javin Paul
aby lepiej zrozumieć zmienne zmienne.
W przypadku braku volatile
słowa kluczowego wartość zmiennej w stosie każdego wątku może być inna. Dokonując zmiennej jakovolatile
wszystkie wątki otrzymają tę samą wartość w pamięci roboczej i uniknięto błędów spójności pamięci.
Tutaj termin variable
może być static
zmienną (klasową) lubinstance
(obiektową).
Jeśli chodzi o zapytanie:
W każdym razie wartość zmiennej statycznej będzie również jedną wartością dla wszystkich wątków, dlaczego więc mielibyśmy stosować zmienność?
Jeśli potrzebuję instance
zmiennej w mojej aplikacji, nie mogę użyć static
zmiennej. Nawet w przypadkustatic
zmiennej spójność nie jest gwarantowana ze względu na pamięć podręczną wątków, jak pokazano na schemacie.
Korzystanie ze volatile
zmiennych zmniejsza ryzyko błędów spójności pamięci, ponieważ każdy zapis do zmiennej lotnej ustanawia relację przed zdarzeniem z kolejnymi odczytami tej samej zmiennej. Oznacza to, że zmiany zmiennej lotnej są zawsze widoczne dla innych wątków.
Co więcej, oznacza to również, że gdy wątek odczytuje zmienną zmienną, widzi nie tylko ostatnią zmianę zmiennej, ale także skutki uboczne kodu, które doprowadziły do zmiany => błędy spójności pamięci są nadal możliwe przy zmiennych zmiennych . Aby uniknąć skutków ubocznych, musisz użyć zmiennych synchronizowanych. Ale java ma lepsze rozwiązanie.
Korzystanie z prostego dostępu do zmiennych atomowych jest bardziej wydajne niż uzyskiwanie dostępu do tych zmiennych za pomocą zsynchronizowanego kodu
Niektóre klasy w java.util.concurrent
pakiecie udostępniają metody atomowe, które nie polegają na synchronizacji.
Więcej informacji można znaleźć w tym artykule dotyczącym kontroli współbieżności na wysokim poziomie .
W szczególności spójrz na zmienne atomowe .
Powiązane pytania SE:
Volatile Vs Atomic
Volatile boolean vs AtomicBoolean
Różnica między zmienną i zsynchronizowaną w Javie