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修饰的变量能够让每个线程都能看见,即可见性。

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值