volatile关键字的作用

Java提供了一种稍弱的同步机制,即volatile变量,用来确保变量的更新操作能通知到其他线程。volatile保证了数据的可见性,禁止重排序,volatile变量不会被缓存到寄存器或者对其他处理器不可见的地方,因此在读取volatile变量的时候总会返回写入的新值。

  • 可见性
    当一个线程修改了变量的值,新的值对于其他线程可见。volatile变量不允许线程直接修改内存,所以对每个线程都是可见的。
  • 禁止重排序
    同一时刻一个变量只允许被一个线程对其进行lock操作;有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置);

    指令重排序:是指CPU采用了允许多条指令不按照程序规定的顺序分开发送给相应的电路单元处理;

作为一个比synchronized更轻量级的锁,在访问volatile变量的时候不会加锁,也就不会遇见阻塞,因此volatile关键字是一种更轻量级的同步机制。volatile适用于一个变量被多个线程共享,而线程会直接给变量赋值;

volatile保证数据可见性的原理:
在这里插入图片描述

上图为一般变量在多线程情况下的读写操作:
  • 当多个非volatile进行读写的过程中,每个线程先从内存拷贝到CPU的缓存中。如果计算机有多个CPU,那么线程可能不再同一个CPU上处理变量,那么意味着每个线程拷贝将变量拷贝到不同的CPU cache中,造成数据不一致的问题;
  • 对于volatile变量,线程每次读取时会越过CPU cache直接读取内存中的数据,由于多个线程共享着同一个进程下的内存空间,所以操作的都是一个变量。

使用场景

volatile关键字适用于单次的读/写,如long,double等 ,但不会保证类似于i++这类的操作;所以使用场景为:
(1)单纯的变量赋值时(boolean true=false之类);
(2)不同的volatile之间不能相互依赖;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值