分析&回答
volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而要彻底的保证有序性和可见性需要使用synchronized等锁处理。
任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于Valatile修饰的变量的修改,所有线程马上就能看到,保证读取 volatile 变量可以观察到对此变量的最后一次写入。
volatile存在的意义是,任何线程对某个变量的修改,都会马上被其他线程读取到,因为直接操作主存,没有线程对工作内存和主存的同步。
volatile 的另一个保证是写入和读取 64 位值( long 类型和 double 类型 )的原子性。如果没有 volatile 修饰符,读取此类字段可能会观察到另一个线程部分写入的值。
反思&扩展
什么场景下可以使用volatile替换synchronized?
只需要保证共享资源的可见性的时候可以使用volatile替代,synchronized保证可操作的原子性一致性和可见性。volatile适用于新值不依赖于就值的情形。
要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
- 1)对变量的写操作不依赖于当前值。
- 2)该变量没有包含在具有其他变量的不变式中
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!