浅谈一下JMM:Java内存模型

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等。关于这些关键字可能以后再写相关博客介绍了。这里主要是介绍内存模型是什么,为了解决什么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值