Вопрос на засыпку: синхронизация на разных volatile
От: seno  
Дата: 17.07.13 08:12
Оценка:
Допустим, у нас есть следующий код:
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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.