JMM内存模型 JAVA Memory Model
java所有的变量都存储在主内存中,共享内存区域,所有线程都可以访问
JVM每个线程创建一个私有工作内存,存储线程私有数据,线程对变量操作是在私有工作内存,需要从主内存中读取变量,copy到私有工作内存,操作完后写回主内存,不能直接操作主内存。
线程间通讯必须通过主内存完成。
多个线程对同一变量操作,会有线程安全问题。
JMM围绕原子性、有序性、可见性展开。
八大原子操作
lock -> read -> load -> use ->
unlock <- write <-store <- assign
volatile 可见性与禁止重排序
1.线程变量可见性,当一个变量被一个线程修改时,其他线程立即得知新值
2.禁止指令重排序优化
无法保证原子性
count++;//无法保证原子性
//1.读取count
//2.count+1
//3.赋值新count
//需要使用volatile字段保证原子性
public static volatile int count = 0;
volatile实际是通过内存屏障实现
内存屏障
在指令键插入Memory Barrier 禁止指令重排序
强制刷出各种CPU的缓存数据