Java内存模型的抽象结构 JMM

news2024/11/18 22:23:25

并发编程模型的两个关键问题

线程之间如何通信及线程之间如何同步

线程之间如何通信:共享内存,消息传递线程之间如何同步
通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制
在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

 Java内存模型的抽象结构 JMM
Java线程之间的通信由 Java内存模型(本文简称为 JMM )控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。

JMM定义了线程和主内存之间的抽象关系扩展
线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

在这里插入图片描述

JMM影响范围JMM影响不到范围
在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(Exception Handler Parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。

JMM的设计

程序员角度编译器和处理器角度
程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模型。
JMM向程序员提供的happens-before规则能满足程序员的需求。JMM的happens-before规则不但简单易懂,而且也向程序员提供了足够强的内存可见性保证JMM对编译器和处理器的束缚已经尽可能少。从上面的分析可以看出,JMM其实是在遵循一个基本原则:只要不改变程序的执行结果(指的是单线程程序和正确同步的多线程程序),编译器和处理器怎么优化都行。
JMM对这两种不同性质的重排序,采取了不同的策略
对于会改变程序执行结果的重排序,JMM要求编译器和处理器必须禁止这种重排序。对于不会改变程序执行结果的重排序,JMM对编译器和处理器不做要求(JMM允许这种重排序)。

-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/569469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven 详细教程(万字长文)

目录 一、Maven的简介二、Maven安装与配置三、Maven POM四、创建 Maven 项目五、Maven项目的构建与测试六、Maven依赖七、Maven仓库(本地仓库远程仓库)八、Maven生命周期(cleansitedefault)九、Maven常用插件十、Maven 版本号约定…

大模型时代的prompt学习(持续更新)

目录 为什么要学prompt基本原则prompt撰写框架Base Prompt FrameworkCRISPE Prompt Framework 场景撰写文案文档竞品分析产品设计数据分析 chain of thoughtzero shotin context learning(few shot)Self-Consistency Program-Aidedprompt tipsTo Do and Not To Doadd examples引…

水下图像0

d_r_1_.jpg 一个拖着电线的水下六足机器人在海水中作业 A robot is exploring the reef on the sea floor A hexapod robot works next to reef at the bottom of the sea A rectangular deep-sea robot swims past a patch of reef An underwater robot is detecting coral …

神经网络视觉AI“后时代”自瞄实现与对抗

通俗一点来说,自瞄是在FPS射击游戏中最为常见的作弊手段之一,当下最火爆的CSGO也深受其扰,在此我说些我自己的看法,欢迎大家在下方留言讨论; (1)软件层面 在神经网络方面的视觉AI应用流行之前&…

面试官:工作三年,还来面初级软件测试?恐怕你的软件测试工程师的头衔要加双引号...

相信身为测试工程师的你可能经历过这些: 已经工作三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。 听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。 由于现在的公司接触不到新技术&…

docker(一)安装部署卸载以及基础命令使用

文章目录 1、安装1.1、安装插件1.2、设置源:1.3、安装docker卸载docker:1.4、配置国内源 2、基础命令3、提交某个镜像为新的镜像4、docker 存档 1、安装 机器配置: 1.1、安装插件 [rootdophin ~]# yum -y install yum-utils1.2、设置源: …

Spring相关面试题(Spring核心)

Spring相关面试题 谁定义了bean的生命周期IOC初始化 IOC启动阶段 (Spring容器的启动流程)Spring-IOC是什么IOC是什么DI是什么 依赖注入 DI的三种方式Spring-AOP是什么OOPAOPAOP实现方式动JDK动态代理和CGLIB动态代理 JDK动态代理和CGLIB动态代理IOC 和 AOP 的联系和区别 BeanFa…

【2023 · CANN训练营第一季】应用开发(初级)第五章——媒体数据处理

1.媒体数据处理 受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不一致时,我们需…

LLMs开源模型们和数据集简介

本篇文章整理下目前常用的LLMs模型们和数据集简介。 BackBones ​https://github.com/FreedomIntelligence/LLMZoo 可以看到目前被广泛用来作为LLMs的backbone的模型有以下特点: Backbone:基于某个开源backbone,如GLM、LLaMA、BLOOMZ&#…

Android 文本识别:MLKIT + PreviewView

随着移动设备的普及和摄像头的高像素化,利用相机进行文本识别成为了一种流行的方式。MLKit 是 Google 提供的一款机器学习工具包,其中包含了丰富的图像和语言处理功能,包括文本识别。PreviewView 是 Android Jetpack 的一部分,它提…

2 files found with path ‘lib/arm64-v8a/libwechatbacktrace.so‘ from inputs

2 files found with path lib/arm64-v8a/libwechatbacktrace.so from inputs 解决方案,在app module的build.gradle里面的 android { } 块里面添加: packagingOptions {exclude lib/arm64-v8a/libwechatbacktrace.so} 如果有多个,就再增加行…

“宝石与石头”:一道简单却巧妙的力扣算法题

本篇博客会讲解力扣“771. 宝石与石头”的解题思路,这是题目链接。 先来审题: 以下是输出示例: 以下是提示: 本题可以使用数组模拟哈希表来实现。先把宝石字符串中的字符标识到数组的对应位置,每次拿石头字符串中的…

ChatGpt免费的镜像网站

目录 1.ChatGpt 简介 2.ChatGpt 免费网站合集 2.1 https://chat21.zhulei.xyz/ 2.2 Vega AI 创作平台 2.3 AI文本工具站 2.4 FancyPig (jqrai.one) 2.5 AiDuTu 1.ChatGpt 简介 ChatGPT是美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&…

geotools简介

geotools简介 官网 https://docs.geotools.org/latest/userguide/index.html 架构图 特性 1. 主要特性 Geotools主要提供各种GIS算法,实现各种数据格式的读写和显示。在显示方面要差一些,只是用Swing实现了地图的简单查看和操作。用户可以根据Geoto…

运营-17.留存

如何定义留存 某段时间内的新增用户,经过一段时间后,又继续使用应用的被认作是留存 用户,这部分用户占当时新增用户的比例即是留存率,即用户没有流失; 例如: 5月份新增用户200,这200人在6月份启…

Abaqus——悬臂梁问题之工字梁实例

参考 有限元基础-第7课(悬臂梁问题)-2022年_哔哩哔哩_bilibili 实例 软件 Abaqus 2022 方法 通过线形式建模 具体操作 建模 1.打开部件的模块,创建一个零件。Name:自定义命名;Modeling Space:梁的空…

认识Vue中组件利器-插槽Slot-案例介绍

一. 插槽的使用 1.1. 认识插槽slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示; 但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定…

项目总结:YOLOv8 人体姿态估计 跌倒检测

细节贴: YOLOv8 人体姿态估计 跌倒检测_爱钓鱼的歪猴的博客-CSDN博客 yolov8-pose的输出中有17个人体关键点 在胸膛处计算出一个中心点,腰部计算出一个中心点,连线,做一个直角三角形,求角的大小。 当角大于60度&…

基础篇009.1 STM32驱动RC522 RFID模块之一:基础知识

目录 1. RFID概述 1.1 RFID工作原理 1.2 RFID分类 1.3 RFID模块 1.4 RFID卡片 1.5 IC卡和ID卡介绍 1.6 IC卡和ID的区分 2. Mifare卡结构原理 2.1 Mifare卡概述 2.2 Mifare非接触式 IC 卡性能简介(M1) 2.2.1 Mifare S50与Mifare S70 2.2.2 S5…

蓝牙spp协议

一.定义 Serial Port Profile,串口通讯协议,是完成蓝牙设备之间创建串口进行数据传输的一种协议。 串口通讯协议(SPP)定义了使用蓝牙进行RS232(或类似)串行电缆仿真的设备应使用的协议和过程。 此协议涵盖的方案通过虚拟串行端口抽象&#…