Простіше кажучи,
статичний : static
змінні асоціюються з класом , а не з будь-яким об’єктом . Кожен екземпляр класу поділяє змінну класу, яка знаходиться в одному фіксованому місці в пам'яті
мінливий : це ключове слово застосовно як до змінних класу, так і до примірника .
Використання змінних змінних зменшує ризик помилок узгодженості пам'яті, оскільки будь-яке записування на мінливу змінну встановлює зв'язок "буває до" з наступними зчитуваннями цієї ж змінної. Це означає, що зміни летючої змінної завжди помітні для інших потоків
Перегляньте цю статтю , Javin Paul
щоб краще зрозуміти мінливі змінні.
За відсутності volatile
ключового слова значення змінної у стеку кожного потоку може бути різним. Зробивши змінну якvolatile
, всі потоки отримають однакове значення в робочій пам'яті, а помилок узгодженості пам'яті уникнуто.
Тут термін variable
може бути static
змінним (класом) абоinstance
(об'єктною) змінною.
Щодо вашого запиту:
У будь-якому випадку значення статичної змінної також буде одним значенням для всіх потоків, то чому ми повинні йти на мінливі?
Якщо мені потрібна instance
змінна у моєму додатку, я не можу використовувати static
змінну. Навіть у випадкуstatic
змінної, консистенція не гарантована завдяки кешу потоку, як показано на схемі.
Використання volatile
змінних зменшує ризик помилок узгодженості пам'яті, оскільки будь-яке записування на мінливу змінну встановлює зв'язок "буває до" з подальшим зчитуванням тієї самої змінної. Це означає, що зміни летючої змінної завжди помітні для інших потоків.
Більше того, це також означає, що коли потік читає мінливу змінну, вона бачить не тільки останню зміну на летючу, але й побічні ефекти коду, які спричинили за собою зміни => помилки консистенції пам'яті, як і раніше, можливі з мінливими змінними . Щоб уникнути побічних ефектів, вам доведеться використовувати синхронізовані змінні. Але є краще рішення у Java.
Використання простого атомного змінного доступу є більш ефективним, ніж доступ до цих змінних через синхронізований код
Деякі з занять у java.util.concurrent
пакеті містять атомні методи, які не покладаються на синхронізацію.
Докладнішу інформацію див. У цій статті про контроль рівня конкурентоспроможності високого рівня .
Особливо подивіться на атомні змінні .
Питання, пов'язані з ДП:
Леткі Vs атомні
Летючий бул проти AtomicBoolean
Різниця між летючими та синхронізованими в Java