1.java内存模型 上

1.java内存模型的起源

jmm规范了java虚拟机与计算机内存如何协调工作 ,他规定了一个线程如何及何时看到其他线程修改过的变量的值,以及在必须时,如何同步的访问共享变量。

我们都知道cpu会经常操作内存中的数据,而cpu的执行速度是要比内存是要快很多的,比如a=a+1 首先cpu会从内存中加载a,然后计算a+1,最后赋值到内存中,a+1很快,但是加载a,和赋值a就很慢。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYXlnc2o=,size_20,color_FFFFFF,t_70,g_se,x_16

所以为了提升速度,cpu厂商想到了一个办法,他们说我们再cpu和内存之间提供一个高速的内存空间,cpu在执行之前会把数据加载到高速内存中,执行时会到高速缓存中查找是否有这个数据,如果没有再到内存中去查找,在此时你们可能没反应过来,为什么这样做速度变快了。

 我在这里大致描述一下,首先我们想要执行一个计算,那么和内存的交互就不可避免,因为我们需要从内存中获得数据,我在上边讲了从内存中加载数据是很耗时的,如果是一个复杂的计算需要加载多个数据,它的执行速度就会因为加载次数变得及其慢,这时我们有了一个高速缓存作为中间层,cpu在执行运算前一次性将要用到的数据加载到高速内存中,等到他要使用的时候直接到高速内存中去查找,如果没有再到内存中去查找,这样就节省了很多的加载时间,而且cpu不和内存直接交互就不需要再等待IO完成,可以直接执行下一条指令了,提高了执行的速度。

这里插一句什么是高速缓存

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYXlnc2o=,size_20,color_FFFFFF,t_70,g_se,x_16

这里又延伸除了一个问题,线程安全!这个也是比较重要的一个问题,从理论上来说没有cache的单核cpu应该是没有线程安全问题的,但是我也没自己实验过,所以如果你们有兴趣可以试一下,然后把结论和我说下,哈哈哈哈

我们主要来说一下拥有cache的cpu。

首先为什么会有线程安全问题

实际上cpu在执行中是会进行切换的,也就是说cpu会存在执行一个计算,执行到一半又去做别的事情的情况。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYXlnc2o=,size_20,color_FFFFFF,t_70,g_se,x_16

比如说现在有两个线程同时走以上的代码块 ,第一个线程走到 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.不同线程直接不能直接访问对方的工作内存,线程之间值的传递都要通过主内存来进行

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYXlnc2o=,size_20,color_FFFFFF,t_70,g_se,x_16

 当然这样也会带来线程安全的问题,比如主内存中有一个共享变量i=1倍线程A,B加载,线程A将i改为2,而线程B将i改为3,此时线程C想要读取i就不知道i的值是2还是3了。

java对此给出的解决办法有两种加锁和volatile关键字

上部分就到这了,文字太多了,再多就要看吐了。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值