Volatile выполняет следующие действия:
- предотвращает кэширование значений в потоке.
- Обеспечивает согласование потоков, имеющих копии значений полей объекта, с основной копией, находящейся в памяти.
- Убедитесь, что данные записываются непосредственно в память и считываются из самой памяти.
## Но условие, при котором volatile не работает:
- Создание Non-Atomic statement Volatile
.
Например:
int count = 0;
count++; // Increment operator is Not Atomic in java
## Лучший вариант:
1. Всегда лучше следовать Brian's Rule
:
When ever we write a variable which is next to be read by another thread, or when we are reading a variable which is written just by another thread, it needs to be synchronized.
The shared fields must be made private, making the read and write methods/atomic statements synchronized.
2. Второй вариант — использовать Atomic Classes
, например AtomicInteger, AtomicLong, AtomicReference и т. д.
## См. эту ссылку, я задал вопрос, похожий на ваш:
Почему Volatile ведет себя странно
person
Kumar Vivek Mitra
schedule
28.11.2012