jmm是针对多线程工作的一个抽象规范
java内存类型
共享变量那个区域叫做主内存
java 每个线程都有自己的工作内存
工作内存里装的是我的线程需要依赖的变量副本
数据同步八大原子操作执行过程
并发编程的可见性,原子性与有序性问题
volatile
1.保证及时可见性
2.不保证原子性
3.保证有序性(指令不重排)
1.从现象上面
A线程读取了成员变量boolean initFlag =false,B线程改了成员变量boolean initFlag =false, 如果不加initFlag不加volatile修饰,A线程再次读取到的值的依旧是boolean initFlag =false,反之加了volatile读取到的就是boolean initFlag =false
2.从字节码层面
如果加了initFlag加了volatile修饰字节码会多出一个ACC_VOLATILE,反正字节码里面则不会有这个修饰符