私はvolatile変数を学習しています。私は揮発性が何であるか知っています、私は揮発性変数のサンプルプログラムを作成しましたが、期待どおりに動作しません。Javaのvolatileキーワードが正常に動作しない
なぜ私は、システムがIが同期に使用すると、変数と値は常に2000
でなければなりません「カウント」キャッシュしてはならないので、揮発使用していた2000年、その後いつかあまり来て「カウント」の最終値がありますそれは正常に動作しますが、volatileキーワードの場合はそうではありません。
public class Worker {
private volatile int count = 0;
private int limit = 10000;
public static void main(String[] args) {
Worker worker = new Worker();
worker.doWork();
}
public void doWork() {
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException ignored) {}
System.out.println("Count is: " + count);
}
}
ありがとうございます!
volatileとsynchronizedは同じではありません...代わりに原子を使用してください.... –
* "私は揮発性が何であるかを知っています" *違反はありませんが、この質問は別の方法で証明されます。 – Tom
"私は揮発性を使用しているため、システムは競合状態(ここで明白な問題)は別として、"カウント "変数をキャッシュしてはいけません。これは完全に間違っています。揮発性は、CPUがメモリ内の値をキャッシュするのを止めるわけではありません。現代のCPUには無意味なので、このようなことをする方法はありません。揮発性は非常に異なるもので、メモリの順序と可視性の保証を理解していないと実際には使用しないでください(理解した後に、より高度な解決策があることがわかります)。 – Voo