Ich versuche, die Verwendung und Bedeutung von volatile
mit einem Beispiel, das nicht wirklich zu einem guten Ergebnis führen würde, wenn volatile
wurde ausgelassen.
Aber ich bin es nicht wirklich gewohnt, mit volatile
. Die Idee des folgenden Codes ist es, eine Endlosschleife auszulösen, wenn volatile
weggelassen wird, und vollkommen thread-sicher ist, wenn volatile
vorhanden ist. Ist der folgende Code thread-sicher? Haben Sie ein anderes realistisches und kurzes Beispiel für Code, der volatile
und würde ohne sie ein offensichtlich falsches Ergebnis liefern?
Hier ist der Code:
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());
}
}