简介
volatile关键字保证了在多线程环境下,被修饰的变量在修改后会马上同步到主存,这样该线程对这个变量的修改就是对所有其他线程可见的,其他线程能够马上读到这个修改后的值。
说明
使用volatile之后,做了如下事情:
1、每次修改volatile变量会立即同步到主存;
2、每次读取volatile变量的值都强制从主存读取最新的值(强制JVM不可优化volatile变量,如JVM优化后变量读取会使用CPU缓存,而不从主存中读取);
3、线程A写入volatile变量之前可见的变量,在线程B中读取该volatile变量以后,线程B对其他在A中可见的变量也可见,换句话说,写A类似于退出同步块,而读取volatile类似于进入同步块。
volatile并不能保证非源自性操作的多线程安全问题得以解决,volatile解决的是多线程间共享变量的可见性问题。
结论
1、volatile解决了线程间共享变量的可见性问题;
2、使用volatile会增加性能开销;
3、volatile并不能解决线程同步问题;
4、解决i++或++i这样的线程同步问题需要使用synchronized或者automicXX类型的包装类,同时也会增加性能开销。
更多可参考:Java Volatile关键字实现原理过程解析