Применяется к полю(fild) для того чтобы не использовать кэш данные , а читать значения напрямую из памяти.
Можно использовать если один поток читает, а другой поток изменяет значение. (Thread safe)
Чтение и запись volatile переменной является потокобезопасной(Thread safe) операцией , а остальные (инкремент , декремент и т.д. ) являются потоко-не-безопасными !!!
инкремент переменной , такой как x=x+1 выгладит как одна операция , однако , на самом деле это последовательность операций чтения-изменения-записи !!!
public class BadVolatile {
private static int i;
// private volatile static int i;
public static void main(String[] args) {
new MyThreadRead().start();
new MyThreadWrite().start();
}
private static class MyThreadWrite extends Thread{
@Override
public void run() {
while (i<8){
System.out.println("increment i " + (++i));
try {
Thread.sleep(512);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private static class MyThreadRead extends Thread{
@Override
public void run() {
int localVar = i;
while (localVar < 8){
if(localVar!=i){
System.out.println("new value of i is "+ i);
localVar = i;
}
}
}}
}