JMM:(Java Memory Model)Java 内存模型。在谈及Java的内存模型,我们先了解一下什么是内存模型。
内存模型:
为了保证效率,每个线程都会有自己的缓存(直接读取主存速度太慢,CPU速度很快),但是如果多个线程操作一个数据的时候,线程都会把此数据放到自己的缓存中,这就可能导致缓存的不一致。例如 线程A修改数据data的值为1,线程B修改数据data的值为2.假设A先执行,那么线程A的缓存中a的值就是1,B后执行,把data修改了,但是线程A用到的data都是1.如果变量data是业务逻辑关键性值,那么就可能导致错误。内存模型就是用来解决缓存一致性的问题。导致缓存不一致的原因除了上面缓存和主存的情况,还有编译器的处理器优化(一般采用指令重排),列如:a=1;b=1;a=2;因为前后都操作a,编译器可能对此进行重排。变为a=1;a=2;b=1;在多线程的情况下,这就可能导致和业务逻辑不符,发送各式各样的意外。缓存不一致只存在于多线程并发的情况,因为只有一个线程操作数据,一个CPU处理数据,不存在不一致的情况。
其实导致缓存不一致的情况,无非就是不满足:可见性,原子性,和有序性。
原子性:是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行。
可见性:是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:即程序执行的顺序按照代码的先后顺序执行。
内存模型:为了保证共享内存的正确性,内存模型定义了共享内存系统中多线程的读写操作的行为规范。保证了并发情况下,场景的原子性、可见性、和有序性。
Java中为了解决并发情景定义的内存模型,就是JMM了。
Java为解决可见性,原则性、有序性提供了很多关键词,常见的有volatile、 synchronized、final等。关于这些关键字可能以后再写相关博客介绍了。这里主要是介绍内存模型是什么,为了解决什么。