Предположим, что AtomicInteger, c
, является общим для двух потоков: thread1 и thread2. Thread1 устанавливает (только один раз) переменную t1
, используя c.incrementAndGet()
. Thread2 устанавливает (только один раз) переменную t2
, используя c.incrementAndGet()
. Как только t1 и t2 установлены, они не устанавливаются снова никаким другим потоком. Предположим, что после того, как thread1 установит t1
, он проверяет значение t2
и получает null
. Гарантируется ли, что впоследствии для t2
будет установлено более высокое значение, чем t1
? (и наоборот). Другими словами, утверждение ниже всегда верно? Так почему?
AtomicInteger c = new AtomicInteger();
volatile Integer t1=null;
volatile Integer t2=null;
//Thread1
t1=c.incrementAndGet();
if(t2 == null){
assert t2==null || t2>t1;
}
//Thread2
t2=c.incrementAndGet();
if(t1==null){
assert t1==null || t1>t2;
}
Я полагаю, что утверждения верны по следующей причине: если t1 назначено значение с приращением c, а t2 еще не присвоено значение с помощью увеличения c, тогда, когда t2 впоследствии будет присвоено значение с помощью увеличения c, оно должно быть больше, чем значение t1.
Обновление: поскольку в соответствии с приведенным ниже правильным ответом утверждения могут не всегда выполняться, я добавил вопрос части 2: Проверка Бывает раньше между потоками и атомарной переменной Часть 2 .