我们都知道cpu会经常 *** 作内存中的数据,而cpu的执行速度是要比内存是要快很多的,比如a=a+1 首先cpu会从内存中加载a,然后计算a+1,最后赋值到内存中,a+1很快,但是加载a,和赋值a就很慢。
所以为了提升速度,cpu厂商想到了一个办法,他们说我们再cpu和内存之间提供一个高速的内存空间,cpu在执行之前会把数据加载到高速内存中,执行时会到高速缓存中查找是否有这个数据,如果没有再到内存中去查找,在此时你们可能没反应过来,为什么这样做速度变快了。
我在这里大致描述一下,首先我们想要执行一个计算,那么和内存的交互就不可避免,因为我们需要从内存中或者数据,我在上边讲了从内存中加载数据是很耗时的,如果是一个复杂的计算需要加载多个数据,它的执行速度就会因为加载次数变得及其慢,这时我们有了一个高速缓存作为中间层,cpu在执行运算前一次性将要用到的数据加载到高速内存中,等到他要使用的时候直接到高速内存中去查找,如果没有再到内存中去查找,这样就节省了很多的加载时间,提高了执行的速度。
这里插一句什么是高速缓存
这里又延伸除了一个问题,线程安全!这个也是比较重要的一个问题,从理论上来说没有cache的单核cpu应该是没有线程安全问题的,但是我也没自己实验过,所以如果你们有兴趣可以试一下,然后把结论和我说下,哈哈哈哈
我们主要来说一下拥有cache的cpu。
首先为什么会有线程安全问题
实际上cpu在执行中是会进行切换的,也就是说cpu会存在执行一个计算,执行到一半又去做别的事情的情况。
比如说现在有两个线程同时走以上的代码块 ,第一个线程走到 a ++的时候,cpu分给线程1的时间片时间到了,此时就切换到了线程2,线程2执行b = a,此时b=2, 这时切换回线程1,线程1有走了一遍,此时b还是等于2,这就问题了,明明我想要的结果是b=3,但是b的结果却有差异,这就是线程不安全(这里提一下cpu是会保存上下文的,所以线程1切换回来后 a =2)
2.什么是java内存模型上边我们了解了cpu,接下来就要说什么是java内存模型了,首先我们要知道的第一点是java内存模型是一种规范而不是一种特定的实现,我们都知道java是一种跨平台的语言,可以实现一次”编译,处处运行“,但是不同的java虚拟机可能是不同的厂商制作的如果他们的一些细节无法同步,那么就无法是实现跨平台,所以java内存模型就出现了,这里还要说一下,java内存模型并不是对物理内存进行规范,而是在虚拟机的基础上进行规范。
2.1 什么是内存模型在知道java内存模型之前,我们需要知道什么是内存模型。
内存模型主要是对程序中的各个变量(实例,静态域,数组等)之间的关系,以及如何将变量从内存中取出,放入的底层细节。
2.2 什么是java内存模型(java的内存模型简称JMM)知道了内存模型是什么之后,我们再看java的内存模型的规定
1.所有的变量都要储存到主内存中
2.线程都要有自己的工作内存
3.线程对变量的 *** 作都要在工作内存中进行,不能直接到主内存中读写
4.不同线程直接不能直接访问对方的工作内存,线程之间值的传递都要通过主内存来进行
当然这样也会带来线程安全的问题,比如主内存中有一个共享变量i=1倍线程A,B加载,线程A将i改为2,而线程B将i改为3,此时线程C想要读取i就不知道i的值是2还是3了。
java对此给出的解决办法有两种加锁和volatile关键字
上部分就到这了,文字太多了,再多就要看吐了。。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)