Java并发编程volatile变量

Volatile

volatile确保对一个变量的更新以一种可预见的形式告知其它线程,意思是volatile保证了可见性,不保证原子性。而且编译器对volatile变量的操作不会是在寄存器或者缓存中,而是内存中,所以它每次取得就是最新值.

例如:

public class VolatileTest extends Thread {

    boolean flag = false;
    int i=0;


    @Override
    public void run() {
        while (!flag){
            i++;
        }
    }

    public static void main(String[] args)throws Exception{
        VolatileTest vt = new VolatileTest();
        vt.start();
        Thread.sleep(3000);
        vt.flag=true;
        System.out.print("i的值为:"+vt.i);
    }
}

预期结果:

打印结果,程序结束

实际结果:

结果是打印了,但是程序没有结束

为什么没结束,这其实要理解操作系统的运行原理,为了提高效率,cpu会有自己的缓存,如果cpu判断到是操作同一个地址的值,那么它是去操作缓存中的数据,然后在同步到内存中,而其它线程拿的还是缓存中的数据,不是内存中的数据,所以拿到的不是最新值.

给变量加volatile

 volatile boolean flag = false;

结果:

输出i的值,线程退出

原因:因为加了volatile,所有的线程在内存中取数据,而不是缓存中,所以可拿到最新的值

volatile一般的应用场景:

  1.写入变量并不依赖变量的当前值,或者确保只有单一的线程修改变量的值

  2.变量不需要和其它的状态变量共同参与不变约束

  3.访问变量时,不需要其它的原因需要加锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值