关于Java内存模型的那点事儿

在很多生产环境中,并发引发的问题总是让人很头疼,而且这样的问题如果解决不好的话,频率会非常的高,所以很多面试官在招聘技术人员的时候会特别重视这一块的问题,以此来考验一个程序员是否能写出线程安全的程序或者解决一个非线程安全的问题。

最近在学习关于并发编程的知识,这一篇是对Java内存模型的理解,记录一下方便后期的回顾,也希望大家看完有所帮助。

1.内存模型需要解决什么问题?

了解或者编写过汇编程序的人都知道,计算机中支持一个程序运行的其实就是一条一条的指令,它们通过在CPU中的有序执行最终实现了软件要完成的功能,而CPU在这个过程中起到了非常核心的作用。

其实在运行一个软件的时候,CPU不仅需要执行这些指令,还有一个重要的工作就是读写数据。

那读哪的数据呢?

一般来说,计算机中的数据是存放在主存当中的,CPU是直接跟主存进行数据交互,最初的时候,这样看起来没啥毛病,不会影响整体效率,但是慢慢得随着技术的发展,CPU的技术越来越牛叉,处理效率越来越高,但是由于硬件技术的限制,内存技术仿佛没有出现很大的变革,那这样问题就来了!

我CPU技术无论再怎么发展,你内存读写太慢,那也影响我们的整体效率啊,总不能我把数据交给你了,然后让我等你半天吧?

为了处理这个问题,后来有人就想到在CPU与主存之间增加一个中介,这个中介必须要速度足够快、占用内存空间足够小才可以,这时候就出现了高速缓存,那程序的执行过程就变成了这样:
在这里插入图片描述
当然,这只是一个最简单的运行过程,在后期技术的发展历程中,还出现了一级缓存、二级缓存、三级缓存等等,而这些缓存都是在CPU中,并且每个CPU核心都只包含一组缓存,那如果CPU是多核,也就有多组这样的缓存。

试想一下这种场景:某个程序在多核CPU、多线程的环境下运行,需要去读写当前进程中的主存数据,如果每个线程都分别占用了一个CPU核心,那每个线程就都各自占有属于自己的缓存区,因为多核CPU在执行程序的时候是可以并行处理的,所以就会出现每个线程分别都去读写自己的缓存这种情况,那这样的话最终处理主存数据可能就存在不一致的问题了,其实这也就是多线程环境中容易出现的:缓存不一致问题!

还有一个问题就是处理器为了提高运算速度有时候会违背代码原有顺序将程序指令进行优化,这个时候可能你的程序所执行的指令就不再是按照你想的顺序来了,这么做的目的肯定是因为提高处理效率。

比如说我们执行了一个程序,多线程环境下指令被乱序优化了,还是跟上面的运行环境一致,在多核CPU运行过程中,让核心A去写入数据1,写完以后设置一个是否写入的标志位,这个时候核心B首先要去判断一下是否写入的标志位再去执行接下来的操作,如果这个地方没有按照计划的顺序执行, 很有可能就会出现数据写入错误的问题,而这个问题在硬件中被叫做:处理器优化问题!

2.内存模型是什么?

为了解决这些问题,保证主存读写的正确性,内存模型就出现了。

内存模型定义了共享内存系统中多线程程序读写操作行为的规范,通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。

3.Java内存模型又是什么?

不同的编程语言都有不同的内存模型,它们都符合计算机内存模型规范,比如在Java语言中,就有Java内存模型(Java Memory Model)简称JMM,它保证了Java程序在各种平台下对内存的访问都能保证最终的效果一致。

在Java虚拟机中,每个线程在执行的时候都有属于自己的工作内存,工作内存中保存着属于自己的那份副本变量,线程做的所有工作都只是对自己的这份变量进行修改或者其他操作,不会直接跟主存进行交互,而且各个线程之间是隔离的,不能干预对方工作内存的变量,如果线程之间想要进行通讯,那只能通过同步主存变量的方式间接交流,而Java内存模型其实就是在工作内存和主存之间进行同步和共享的桥梁,它决定了这份变量什么时候、以什么方式进行同步,大体的交互方式例如下图:
在这里插入图片描述

4.总结

其实Java内存模型在整个程序的执行过程中,是解决了并发编程三要素所对应的三大问题:原子性问题、可见性问题以及有序性问题。

通过控制线程工作内存与共享主存之间的数据同步解决了缓存不一致的问题,这刚好对应着并发编程中的可见性问题;

通过阻止处理器进行乱序执行命令,解决了处理器优化问题,对应着并发编程中的原子性问题和有序性问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值