计算机在执行程序的时候,每条指令都是在CPU中执行的,而计算机的数据是存储在内存当中的,因此CPU在执行的过程中会不断读取在内存当中的数据。
但是随着硬件的发展,CPU的速度越来越快,但是内存的速度没有发生太大的改变 所以CPU在执行程序的时候,很大一部分的时候都在等候内存中的数据。
为了减少CPU等待内存中的数据,引入了高速缓存的概念。
程序在运行的过程中,会将需要运到的一部分数据从主存中拷贝一份到高速缓存中,那么CPU在执行过程中就会从高速缓存读取数据,并向高速缓存中写入数据,当运算结束后,再将高速缓存的数据刷新回主内存中。
后面慢慢引入了一级缓存,二级缓存,三级缓存
那么在多线程的场景下就会存在缓存一致性问题,除此之外,CPU还会对代码进行乱序优化处理,因此就出现缓存一致性以及指令重排序问题。
因此就引入了内存模型。
JMM是java虚拟机规范中所定义的一种内存模型,屏蔽掉了底层不同计算机的区别,目的是解决由于多线程通过共享内存的方式进行通信时,所带来的的缓存一致性,指令重排序等问题。保证并发编程场景中的原子性、可见性和有序性。
Java内存模型规定了所有的变量都存储在主内存当中,每个线程都有自己的工作内存,每个线程的工作内存中保存了主内存变量的副本拷贝。线程所有的操作都在自己工作内存当中操作,不能直接读写主内存。
不同线程之间的工作内存也无法直接访问的,线程之间的变量传递都需要通过工作内存和主内存之间进行数据同步进行。
Java内存模型的实现有一些常见的关键字或者类,比如final,volatile,synchronized,JUC包等等。
具体可看分解。