volatile的用法示例
问题描述
1、两个线程访问共享变量时,值不同步(线程一需等待线程二数据准备好之后再执行业务逻辑,实际却是线程一死循环了)
1)代码如下
public class Voletite { private static boolean initFlag = false;//共享变量 public static void main(String[] args) throws InterruptedException { //做业务的线程 new Thread(new Runnable() { @Override public void run() { System.out.println("等待数据。。。。"); while (!initFlag){ } System.out.println("工作完成了"); } }).start(); //保证第一个线程先执行 Thread.sleep(2000); //准备数据的线程 new Thread(new Runnable() { @Override public void run() { System.out.println("开始准备数据。。。"); initFlag = true; System.out.println("数据准备完毕。。。"); } }).start(); } }
2)运行结果如下,
3)结论
线程一中的"工作完成了"始终没有打印,说明线程一没有更新到线程二修改的值。
解决方案
1、把共享变量通过volatile关键字修饰,如下图所示
2、运行结果,如下图所示
3、结论
线程一读取到了线程二更新之后的值。
延伸
1、jmm(java的内存模型,java memory model),每个线程都会把共享变量复制一份到工作内存中,如下图所示
2、volatile的作用
多线程时,让volatile修饰的变量能够让每个线程都能看见,即可见性。
3、volatile的原理
待续