volatile只有可见性,就是说一个线程改了某个值之后,其他线程能马上得到最新的值,不过volatile不具有原子性,也就是说线程之间是不安全的,在开发中少用。
1.重排序:从cpu方面出发,为了尽可能减少内存操作速度远慢于CPU运行速度所带来的CPU空置的影响,虚拟机会把一些后面的代码提到前面执行,但是在单线程的情况下,不会出现顺序混乱的问题,比如:
public void execute(){
int a=0;
int b=1;
int c=a+b;
}
这里a=0,b=1两句可以随便排序,不影响程序逻辑结果,但c=a+b这句必须在前两句的后面执行。