全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  java技术干货  >  详情

volatile关键字有什么作用(变量可见性、禁止重排序)

来源:千锋教育
发布人:wjy
2022-11-23

推荐

  Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。volatile变量具备两种特性,volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

  变量可见性

  其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。

volatile关键字有什么作用(变量可见性、禁止重排序)

  禁止重排序

  volatile禁止了指令重排。

  它是一种比*sychronized* 更轻量级的同步锁。我们在访问 volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 sychronized关键字更轻量级的同步机制。

  volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。当对非volatile变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的CPU cache中。而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过CPU cache这一步。

  适用场景

  值得说明的是对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证 i++这种操作的原子性,因为本质上 i++是读、写两次操作。

  在某些场景下可以代替Synchronized。但是,volatile的不能完全取代Synchronized的位置,只有在一些特殊的场景下,才能适用volatile。

  总的来说,必须同时满足下面两个条件才能保证在并发环境的线程安全:

  1. 对变量的写操作不依赖于当前值(比如 i++),或者说是单纯的变量赋值(boolean flag = true)。

  2. 该变量没有包含在具有其他变量的不变式中,也就是说,不同的volatile变量之间,不能互相依赖。只有在状态真正独立于程序内其他内容时才能使用volatile。

相关文章

java两个日期比较相差多少天

2023-06-27

javasubstring截取字符串的用法?

2023-06-25

find命令查找文件

2023-06-16

如何添加Java环境变量

2023-06-08

随机函数rand怎么使用

2023-04-20

什么是单体架构?单体架构有什么优缺点

2023-04-11
在线咨询 免费试学 教程领取