Использование volatile для переменной снижает риск ошибки согласованности памяти (пожалуйста, исправьте меня, если это выявит некоторые недостатки в моем понимании любой соответствующей концепции). Таким образом, в следующем примере, даже если переменная c1 является нестабильной, до сих пор появление результатов ошибки Постоянство памяти в c1 становится 15 или иногда 14 на выходе, а затем правильный выход 16.Использование volatile по атомным переменным
class Lunch implements Runnable {
private volatile long c1 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
// synchronized(lock1) { c1 is volatile
c1++;
// }
}
public void run() {
try {
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
}
catch(InterruptedException e) {
return;
}
}
public long value() {
return c1;
}
public static void main(String args[]) throws InterruptedException {
Lunch l = new Lunch();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(l.value());
}
}
Предполагается, что ++ является атомарным. Проверьте свои предположения! – nos
(Я немного беспокоюсь о том, что вы используете фразу «снижает риск». Обычно цель заключается в том, чтобы не создавать никакого риска.) –