public class MyThread
{
volatile static int i;
public static class myT extends Thread
{
public void run()
{
int j = 0;
while(j<1000000){
i++;
j++;
}
}
}
public static void main (String[] argv)
throws InterruptedException{
i = 0;
Thread my1 = new myT();
Thread my2 = new myT();
my1.start();
my2.start();
my1.join();
my2.join();
System.out.println("i = "+i);
}
}
Поскольку волатильные сборки происходят до отношения, окончательное значение i должно быть строго 2000000. Однако фактический результат ничем не отличается от того, чтобы быть нестабильным для переменной i. Может ли кто-нибудь объяснить, почему он здесь не работает? Так как i объявлен volatile, он должен быть защищен от несоответствия памяти.Явная переменная volatile не работает корректно.
Только 'i' должен быть' AtomicInteger'; 'j' является чисто локальным для потока. –
Тогда в чем смысл объявлять меня изменчивым? Так как он все равно не защищен. – OneZero
Спасибо @MelNicholson. Я уже обновил свой ответ. – Gray