可见性 原子性

原子操作:要么发生,要么不发生,不可被分割的
java的内存模式堆内存(主内存)是共享的,但是线程的栈内存是私有的,会拷贝主内存下来通过read,write,store,load(4个原子操作)
不可见,比如A线程改了,还没通知修改主内存,B线程不可见,虽然4个都是原子操作,但是多个步骤就不是了
加上volatile才会有可见性,不会被重排序,因为不可缓存,直接修改主内存,B线程就可见了,java-client好像没事,不加volatile java-server模式启动可能出现重排序,因为编译会进行优化
在单线程是有序的符合先行的可能被重排序以至于优化
java-server模式启动慢运行快,java-client启动快运行慢
volatile只能保证可见,和重排序,多线程还是可能不正确
使用volatile比如a=1这种只是赋值一个常量,不会作为变量在右边,因为a=b这种不是原子的
要原子操作可以用AtomicInteger类或者给变量或块或方法加锁,临界区等

原文地址:https://www.cnblogs.com/HaibaraAi/p/6534623.html