面试官:谈谈对volatile的理解


程序员的公众号:源1024获取更多资料,无加密无套路!

最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


volatile是Java虚拟机提供的轻量级的同步机制

具有以下特点

  • 保证可见性

volatile保证了多个线程对共享变量的操作是可见的。当一个线程修改了共享变量的值,其他线程会立即看到这个改变。

在对volatile定义的变量进行修改时,会加上写屏障,从而保证修改的共享变量会马上对其他CPU暴露。

在对volatile定义变量进行读取的时,会加上读屏障,从而保证读取的共享变量值是最新的。

  • 禁止指令重排

volatile通过禁止指令重排来保证指令顺序性。在多线程环境下,为了提高程序的执行效率,编译器和处理器可能会对指令进行重新排序。但是,如果一个被volatile修饰的变量,就禁止了指令重排,确保每个线程都能看到正确的操作顺序。

  • 不能保证原子性

想保证原子性,可以结合其他同步机制,如synchronized关键字或java.util.concurrent.atomic包中的原子类。

总结
  1. volatile属性的读写操作都是无锁的,它不能替代synchronized,因为它没有提供原子性和互斥性。

  2. 因为无锁,不需要花费时间在获取锁和释放锁_上,所以说它是低成本的,效率较高。

  3. volatile只能作用于属性,volatile修饰属性,编译器就不会对这个属性做指令重排序。

  4. volatile提供了可见性,任何一个线程对其的修改将立马对其他线程可见。

  5. volatile属性不会被线程缓存,始终从主内存中读取。

  6. volatile可以在单例双重检查中实现可见性和禁止指令重排序,从而保证安全性。

你可能感兴趣的:(java,java,开发语言)