私は話題がたくさんある知っているスタックオーバーフローで提供されていますが、私はvolatileキーワードについて学ぶしようとしているとして、理論的には、私は私にはその明確なと考えていますが、私は、次の例を実行しようとしたとき、私の理解が失敗したか、私れますシーケンスを視覚化できません。スレッドの同期やvolatileキーワード
volatile-の理解>Making variable as volatile for an instance, makes it non cacheable for threads that means whichever thread is accessing the volatile variable it has to flush the changes into the main memory immediately so that changes should be visible to other thread.
しかし、あなたは出力を参照してください場合は、この例では、スレッドAは6は、スレッドBが、これはそれが必要変わる見たときに、それはそう、メインメモリにフラッシュされるべき数などの揮発性のあるものとして値を書き込みます変更はなく、スレッドBが、私はスレッドあなたがスレッドの実行が起こるか視覚化するために私を助けてくださいすることができますを視覚化することはできませんよ2の代わりに、6または7
を示している参照してください。
public class PerfectExampleToUnderstandVolatile {
public static void main(String[] args) {
ThreadSample sample = new ThreadSample();
Thread thread = new Thread(sample,"threadA");
Thread thread1 = new Thread(sample,"threadB");
Thread thread2 = new Thread(sample,"threadC");
thread.start();
thread1.start();
thread2.start();
}
}
class ThreadSample implements Runnable {
volatile int count;
public ThreadSample() {
}
@Override
public void run() {
while (count < 15) {
System.out.println(Thread.currentThread().getName() + " " + count);
count++;
}
}
}
出力
**threadA 0**
threadA 1
threadA 2
threadA 3
threadA 4
threadA 5
**threadA 6** at this point thread A writes 6
**threadB 0** so here thread B should show 6
threadA 7
**threadC 6** same should be here
threadC 9
threadA 10
threadB 11
threadB 13
threadB 14
threadA 12
threadC 11
読み書きが同期されているからといって、出力が同期されているだけであるからといって、あなたが言うのは道徳的だと言えるでしょう。 –
SysoutはやはりIo操作なので、基本的に他のスレッドが引き継ぐコンソールに書き込む前です。 –
@youtubefreakより正確には、問題は読み書き操作と出力がアトミックではないことです。 – AdamSkywalker