Java内存模型中的可见性,原子性和有序性
其中可见性是指线程之间的可见性,即一个线程修改的状态对另一个线程是可见的。通常情况下一个线程修改了某一状态因为线程内部缓存和重排序的存在,修改结果对于其他线程是不可见的。
在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,无法得到正确的结论。
使用volatile关键字区别如下:
不使用:每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。
使用:当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。