【Java多线程系列】基本原理(3)Java内存模型JMM

作者 : 开心源码 本文共1819个字,预计阅读时间需要5分钟 发布时间: 2022-05-13 共152人阅读

本篇属于【Java多线程系列】文章第一章【基本概念与底层原理】的第三小节内容,作为了解Java线程运行原理的基础知识,我们会对Java的内存模型JMM(Java Memory Model)进行详细讲解。

什么是Java内存模型

在面试过程中,我们经常会被问到一个问题,请你讲解一下内存模型,这通常指的是JVM的内存分区(由堆、栈、程序计数器、元空间、本地方法栈组成),而本篇所讲的Java内存模型指的是一种虚拟机以及内存访问的规范

“一次编写,四处运行”(Write once, run anywhere)是Java程序设计语言的跨平台特性的口号。?理想中这意味着Java可以在任何设施上开发,编译成一段标准的字节码并且可以在任何安装有Java虚拟机(JVM)的设施上运行,在芯片、设施和软件包中安装Java已经成为一种工业实践的标准。

我们知道,Java程序是需要运行在Java虚拟机JVM上面的,因而Java的内存模型主要目的是为了屏蔽各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范

JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其余线程修改过后的共享变量的值,以及在必需时如何同步的访问共享变量。

主存 VS 工作内存

JMM定义了线程和主内存之间的笼统关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。

线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必需在工作内存中进行,而不能直接读写主内存中的变量。

不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

八大原子操作

JMM定义了八大原子操作,以此来实现主存与工作内存间的数据交互,并确保每一种操作是原子性的,也就是不可分割的:

lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。

unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其余线程锁定。

read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用

load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。

use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。

assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。

write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

假如需要把一个变量从主内存复制到工作内存,那就要顺序地执行read和load操作,假如要把变量从工作内存同步回主内存,就要顺序地执行store和write操作。

注意,Java内存模型只需求上述两个操作必需按顺序执行,而没有保证是连续执行。也就是说read与load之间、store与write之间是可插入其余指令的,如对主内存中的变量a、b进行访问时,一种可能出现顺序是read a、read b、load b、load a。

Java内存模型的实现

理解Java多线程的朋友都知道,在Java中提供了一系列和并发解决相关的关键字,比方volatile、synchronized、final、concurren包等。其实这些就是Java内存模型封装了底层的实现后提供给程序员使用的少量关键字。

在开发多线程的代码的时候,我们可以直接使用synchronized等关键字来控制并发,素来就不需要关心底层的编译器优化、缓存一致性等问题。所以,Java内存模型,除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。

对于这些具体的实现方式包括少量工具类,我们将在接下来的文章进行详细的讲解。

本文系【程序因子】版权作品,未经受权严禁转载,同时也欢关注同名公众号【程序因子】迎投稿及合作。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 【Java多线程系列】基本原理(3)Java内存模型JMM

发表回复