1.volatile会强制线程每次都从主内存中读取变量的值,而不是用cpu缓存中的值(涉及到java内存模型),同时每次写volatile变量的时候也同时刷新到主内存中
2.happens-before原则 当写一个 volatile 变量时,随后对该变量读时会创建一个 happens-before 关系,所有在 volatile 变量写操作之前完成的写操作,将会对随后该 volatile 变量读操作之后的所有语句可见。
3.重排序 只会对volatile变量之前或之后的重排序,不会把volatile之前的语句排到volatile后面,反之亦然。
摘自:http://www.importnew.com/17149.html