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)运行结果如下,

volatile的用法示例

3)结论

线程一中的"工作完成了"始终没有打印,说明线程一没有更新到线程二修改的值。

解决方案

1、把共享变量通过volatile关键字修饰,如下图所示

volatile的用法示例

2、运行结果,如下图所示

volatile的用法示例

3、结论

线程一读取到了线程二更新之后的值。

 

延伸

1、jmm(java的内存模型,java memory model),每个线程都会把共享变量复制一份到工作内存中,如下图所示

volatile的用法示例

2、volatile的作用

多线程时,让volatile修饰的变量能够让每个线程都能看见,即可见性。

3、volatile的原理

待续