volatile 可见性

volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。
                          相较于 synchronized 是一种较为轻量级的同步策略。

volatile修饰的变量在被一个线程修改后,会被强制立即刷新到主存(可见性),其他线程如果有该变量的缓存行,会被设置为无效。

程序:

ThreadDemo线程更改flag为true,在main线程中循环,直到flag为true,打印--------,然后结束循环。

 volatile 可见性

 程序一直不结束。

 volatile 可见性

 原因:JVM会为两个线程分配两个私有缓存区域,两个线程都会从主存内(共享内存)拿到flag,在各自的私有内存里面对变量进行操作,然后刷新到主存。

因为ThreadDemo休眠200毫秒,main线程先执行,然后ThreadDemo再执行。

第一次

if (threadDemo.isFlag())  判断为false

第二次按理说可以结束循环,但是while循环指令优先级高,导致每次在私有内存中拿到数据,每次拿到的还是原来的数据。

我们可以通过给变量加上volatile关键字,让main线程强制每次去主存中拿变量,解决问题。

volatile 可见性

 程序结束

volatile 可见性