image

编辑人: 独留清风醉

2024-10-20

0

926

说说你了解的volatile关键字

分析&回答

volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而要彻底的保证有序性和可见性需要使用synchronized等锁处理。

任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于Valatile修饰的变量的修改,所有线程马上就能看到,保证读取 volatile 变量可以观察到对此变量的最后一次写入。

volatile存在的意义是,任何线程对某个变量的修改,都会马上被其他线程读取到,因为直接操作主存,没有线程对工作内存和主存的同步。

volatile 的另一个保证是写入和读取 64 位值( long 类型和 double 类型 )的原子性。如果没有 volatile 修饰符,读取此类字段可能会观察到另一个线程部分写入的值。

反思&扩展

什么场景下可以使用volatile替换synchronized?

只需要保证共享资源的可见性的时候可以使用volatile替代,synchronized保证可操作的原子性一致性和可见性。volatile适用于新值不依赖于就值的情形。

要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

  • 1)对变量的写操作不依赖于当前值。
  • 2)该变量没有包含在具有其他变量的不变式中

喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

创作类型:
原创

本文链接:说说你了解的volatile关键字

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章