иллюстрирует изменчивость: является ли этот код потокобезопасным?
Я пытаюсь проиллюстрировать использование и важностьvolatile
с примером, который действительно не даст хорошего результата, еслиvolatile
был опущен
Но я не очень привык к использованиюvolatile
, Идея следующего кода состоит в том, чтобы вызвать бесконечный цикл, еслиvolatile
опущен, и быть полностью поточно-ориентированным, еслиvolatile
настоящее. Является ли следующий код потокобезопасным? У вас есть какой-нибудь другой реалистичный и короткий пример кода, который используетvolatile
и дал бы заведомо неверный результат без него?
Вот код:
public class VolatileTest implements Runnable {
private int count;
private volatile boolean stopped;
@Override
public void run() {
while (!stopped) {
count++;
}
System.out.println("Count 1 = " + count);
}
public void stopCounting() {
stopped = true;
}
public int getCount() {
if (!stopped) {
throw new IllegalStateException("not stopped yet.");
}
return count;
}
public static void main(String[] args) throws InterruptedException {
VolatileTest vt = new VolatileTest();
Thread t = new Thread(vt);
t.start();
Thread.sleep(1000L);
vt.stopCounting();
System.out.println("Count 2 = " + vt.getCount());
}
}