(Notice:以下所有经验也是我根据网上的经验整理的,如有侵权可以联系我删除,Wx:IT_Ezra,QQ 654303408。 有问题讨论也可联系我)

java内存模型,是我上次面试的时候,被问懵逼的一部分内容。所以我在这里就根据我自己的理解稍微聊一下这一块儿。

java内存模型,又称为JMM。对于面试而言,JVM内加粗样式存结构这一块儿已经被问烂了,所以为了考验每个人的功底,会扯出这么一块儿部分来聊。那么到底什么是JMM呢。其实对于计算机专业的同学来说,JMM可以理解为CPU的内存模型,那么CPU的内存模型是怎么样的呢。对于CPU来说,它分为主内存和工作内存,之间通过高速缓存来进行通讯。那么JMM类似(网上Q一张图),

java 几种内存模型 java内存模型jmm_有序性

我们可以看到不同的Java线程之间通讯,是要去获取主内存上的数据,拷贝到自己的线程空间中,然后继续使用。这个过程中,我们会发现,如果我从主内存中拷贝过来A,然后我们要将A进行写操作。而与此同时,另一个线程也要要对这个变量进行写操作。那么我们就会发现,会产生线程安全的问题。线程1拿到A,进行了一次+1操作。线程2也拿到A,进行了一次+1操作。最后这个A变量的结果只进行了一次+1,另一次+1操作已经被覆盖掉了。如何解决这个问题呢? 有一个关键字叫做volatile。这个关键字可以保证数据的可见性。
那么什么是可见性呢?JMM有三大特性,分别是原子性,可见性,有序性。volatile保证了可见性和有序性。经过volatile修饰的变量,每次获取的时候,都会经历一次从主内存刷到工作内存的过程。这样我们每次读取到的都是最新的数据。但是,然而我们不能保证执行方法的线程是什么程度获取到的,所以volatile可以保证内存可见性,不能保证并发有序性(不具有原子性)。
所以对于面试的时候,别人问你,什么是JMM,你要对java模型有一个大致的了解,是一个主内存加若干个工作内存的结构,更深入一点可以了解happens-before的机制,内存屏障是做了什么操作,这些都是涉及到指令集方面的内容,更加底层,有兴趣可以了解。但是对于一般面试,你只需要知道是保证可见性,不能保证原子性,所以还是会存在一定程度的线程安全问题。另外,所有变量获取之后,都是放到了工作缓冲区。