程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
volatile是Java虚拟机提供的轻量级的同步机制
具有以下特点:
-
保证可见性
volatile保证了多个线程对共享变量的操作是可见的。当一个线程修改了共享变量的值,其他线程会立即看到这个改变。
在对volatile定义的变量进行修改时,会加上写屏障,从而保证修改的共享变量会马上对其他CPU暴露。
在对volatile定义变量进行读取的时,会加上读屏障,从而保证读取的共享变量值是最新的。
-
禁止指令重排
volatile通过禁止指令重排来保证指令顺序性。在多线程环境下,为了提高程序的执行效率,编译器和处理器可能会对指令进行重新排序。但是,如果一个被volatile修饰的变量,就禁止了指令重排,确保每个线程都能看到正确的操作顺序。
-
不能保证原子性
想保证原子性,可以结合其他同步机制,如synchronized关键字或java.util.concurrent.atomic包中的原子类。
总结
-
volatile属性的读写操作都是无锁的,它不能替代synchronized,因为它没有提供原子性和互斥性。
-
因为无锁,不需要花费时间在获取锁和释放锁_上,所以说它是低成本的,效率较高。
-
volatile只能作用于属性,volatile修饰属性,编译器就不会对这个属性做指令重排序。
-
volatile提供了可见性,任何一个线程对其的修改将立马对其他线程可见。
-
volatile属性不会被线程缓存,始终从主内存中读取。
-
volatile可以在单例双重检查中实现可见性和禁止指令重排序,从而保证安全性。