Допустим, у нас есть следующий код:
int a = 0;
volatile boolean flag = false;
И у нас есть два треда, которые выполняют следующие действия:
Thread 1
a = 1;
flag = true;
Thread 2
if (flag)
System.out.println(a);
Фишка в том, что благодаря volatile переменной второй либо ничего не отпечатает, либо гарантированно отпечатает 1. Это аксиома, именно для этого семантика volatile правилась в обновленной JMM (
http://www.ibm.com/developerworks/library/j-jtp02244/index.html).
Но давайте теперь рассмотрим несколько иной случай.
int a = 0;
boolean flag = false;
volatile int var1 = 0;
volatile int var2 = 0;
Thread 1
a = 1;
flag = true;
var1 = 1; // Записали в volatile
Thread 2
int tmp = var2; // Прочитали другую volatile
if (flag)
System.out.println(a);
Вопрос: каковы возможные результаты работы
Thread 2 (можно выбрать несколько)?
а) Ничего не отпечатает;
б) Отпечатает 0;
в) Отпечатает 1.