- volatile被誉为 轻量级的synchronized,也是java编程中比较重要的一个关键字。
- 和synchronized不同,
- volatilze是一个变量修饰符,只能用来修饰变量
- 无法修饰方法及代码块。
- 被volatile修饰的共享变量,就具有了以下两点特性
- 保证了不同线程对该变量操作的内存可见性。
- 禁止指令重排序。
4. 保证可见性
- 可见性指多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值
- 实现原理
- 当对volatile(易挥发的)变量进行读写的时候,每个线程先从主内存拷贝变量到cpu缓存中,
如果计算机有多个cpu,每个线程可能在不同的CPU上被处理,意味着每个线程可以拷贝到不同的CPU cache中。
- volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,保证了每次读写变量都从主内存中读,跳过CPU Cache这一步。
当一个线程修改了这个变量的值,新值对于其他线程是立即得知的。
5. 禁止指令重排
- 指令重排是JVM为了优化指令、提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。
- 指令重排序包括编译器重排序和运行时重排序;
- volatile变量禁止指令重排序,针对volatile修饰的变量,在读写操作指令前后
- 会插入内存屏障,
- 指令重排序时不能把后面的指令重排序到内存屏障。?
posted @
2025-05-17 20:58
kuki'
阅读(
25)
评论()
收藏
举报