JMM java内存模型

2023-11-02

java内存模型

即 java memory model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。
JMM 体现在以下几个方面:
	原子性 - 保证指令不会受到线程上下文切换的影响
	可见性 - 保证指令不会受 cpu 缓存的影响
	有序性 - 保证指令不会受 cpu 指令并行优化的影响

可见性

当jit编译器频繁从主存中读得共享变量时,会将共享变量的值缓存到工作内存中。直接从工作内存中读取,提升效率。而主存中的值改变了,也不管,失掉了可见性。
解决方案:
	volatile(易变关键字)
	它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存
可见性 vs 原子性:
	 synchronized 语句块既可以保证代码块的原子性,也同时保证代码块内变量的可见性。但缺点是synchronized 是属于重量级操作,性能相对更低

有序性

可能使得多线程状态下,对共享变量的计算产生不同的结果
volatile 修饰的变量,可以禁用指令重排。

volatile 原理

volatile 的底层实现原理是内存屏障,Memory Barrier(Memory Fence)
	1、对 volatile 变量的写指令后会加入写屏障
	2、对 volatile 变量的读指令前会加入读屏障
	 3、如何保证可见性?
	 	写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中
	 	而读屏障(lfence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据
	 4、如何保证有序性?
	 	写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后
	 	读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前

happens-before

happens-before 规定了对共享变量(变量都是指成员变量或静态成员变量)的写操作对其它线程的读操作可见;
它是可见性与有序性的一套规则总结,抛开happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见

同步模式之 Balking

Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回		 

两阶段终止模式

Two Phase Termination
在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。
错误思路:
	使用线程对象的 stop() 方法停止线程
	使用 System.exit(int) 方法停止线程
两阶段终止模式:
	1、利用 isInterrupted:
		interrupt 可以打断正在执行的线程,无论这个线程是在 sleep,wait,还是正常运行
	2、利用停止标记:
		volatile 保证该变量在多个线程之间的可见性
		主线程把它修改为 true 对 别的线程可见
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JMM java内存模型 的相关文章

  • Spring Security 通过并发登录尝试将用户锁定

    我是安全新手 遇到了一个问题 该问题导致用户帐户被锁定 只有重新启动应用程序才能修复它 我有一个带有 spring security 4 0 2 RELEASE 应用程序的 spring boot 1 3 0 BUILD SNAPSHOT
  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • 如何从 WifiP2pDeviceList 获取 wifi direct 设备名称

    我想在执行请求对等点时获取 wi fi direct 名称 这是我的代码 if WifiP2pManager WIFI P2P PEERS CHANGED ACTION equals action Log d tag success dis
  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • Javadoc 1.5 和 1.6 中缺少 enum.valueOf(String name)

    这可能是一个愚蠢的问题 但我正在使用该方法enum valueOf String name 那里没问题 只是当我检查 javadoc 以了解有关此方法的更多信息时 我找不到它 有javadoc用于valueOf Class
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 从 sbt 程序集运行 uber jar 会导致错误:无法找到或加载主类

    我有一个使用 sbt 程序集插件打包为 uber jar 的 Spark 作业 这build sbt指定一个可运行的 main 作为生成的 uber jar 的目标 mainClass in assembly Some com foo Ba
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有

随机推荐

  • 如何用pip升级python版本,python的pip升级没反应

    大家好 小编为大家解答python的pip如何更新到最新版本的问题 很多人还不知道如何用pip升级python版本 现在让我们一起来看看吧 1 pip如何升级 第一步 首先检测一下我们电脑是否安装了python 打开命令提示框 输入pyth
  • ir指令、立即数的作用_我们一起学RISC-V——05-RV32I指令集

    本期内容如下 RISC V指令格式 RV32I指令命名规则 RV32I指令集 重点指令详解 一 RISC V指令格式 RISC V按照32bit的指令不同字符的具体分布共分为6种基本格式 分别是R类型 I类型 S类型 U类型 J类型 B类型
  • jdbc获取一行字符串_JDBC基础

    什么是JDBC JDBC就是Java程序访问数据库的规范 是一个规范定义接口 各种数据库厂家实现了JDBC这个接口 这些实现类就是数据库驱动 使用时只需要调用接口中的方法即可 不用关注类是如何实现的 JDBC的核心API有以下几种 Driv
  • 前端学习——css盒子模型、css3新特性、伪类、布局0711TODO

    样式还是得具体使用才能理解 不然会忘记也理解不透彻 还有定位 元素溢出 浮动 布局水平 垂直对齐 css3新特性 1过渡 2 动画 3 2D 3D转换 伪类 三种定位方式 弹性布局 栅格布局
  • 餐馆(餐馆有n张桌子,每张桌子有一个参数a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 不允许拼桌的情况下,选择其中一部分客人,使得总预计消费金额最大)

    餐馆 某餐馆有n张桌子 每张桌子有一个参数 a 可容纳的最大人数 有m批客人 每批客人有两个参数 b人数 c预计消费金额 在不允许拼桌的情况下 请实现一个算法选择其中一部分客人 使得总预计消费金额最大 输入描述 输入包括m 2行 第一行两个
  • (手工)【sqli-labs42、43】POST注入、堆叠注入、错误回显、字符型注入

    目录 一 推荐 二 手工 SQL注入基本步骤 三 Less42 POST Error based String Stacked 3 1 简介 堆叠注入 错误回显 字符型注入 3 1 第一步 注入点测试 3 3 第二步 分析过滤 3 4 第三
  • 微软华裔科学家和他们的又一次冲动

    站在放映着自己照片的大屏幕前 对着现场的300人 西装革履的李世鹏有点紧张 发言稿是事先写好的 但他时不时中断几秒 好像忘了词儿 金山CEO张宏江揶揄瞬间转换身份的他 有点做作 微软门徒 李世鹏 在一幅拍摄于2001年的照片上 李世鹏与比尔
  • VsCode必备插件

    open in browser 安装浏览器插件 用于访问html页面 在 扩展栏 的搜索框中输入 open in browser 使用 Alt B 使用默认浏览器打开当前 html 页面 或 Shift Alt B 选择其他浏览器 Vetu
  • 【第十三讲】TMS320F28335开发板之DMA模块

    直接存储器访问 DMA 模块 一 内存与外设进行数据交换的方式 中断方式 每传输一次数据 就必须经历中断处理的全部步骤 而且一般需要借助CPU内部的寄存器作为中介 也就是说CPU需要从来源把每一片段的资料复制到暂存器 然后把它们再次写回到新
  • Vue 组件基础

    VUE 一 开发工具 VUE开发环境个人推荐使用VS code 然后安装特定的插件即可开发 可用插件如下 Vetur 语法高亮 智能感知 Emmet等 EsLint 语法纠错 Auto Close Tag 自动闭合HTML XML标签 Au
  • kibana常见启动报错

    环境 Ubuntu16 04 报错1 连接elasticsearch kibana启动报错 报错信息 Status changed from uninitialized to green Ready log 08 29 01 886 err
  • ModelSim的入门仿真步骤(图文干货)

    ModelSim仿真分为以下6个主要步骤 1 新建工程 2 新建或导入工程文件 3 文档编译 4 开始仿真 5 添加仿真波形 6 调整仿真时间 1 新建工程 点击左上角 File Project 弹出如下界面 在 Project Name
  • qt提升控件之后,编译报错

    引言 自定义的控件 在ui文件中将控件提升为自定义的控件 提升的时候没有指明提升的头文件的相对路径或者绝对路径 导致编译的时候无法找到相应的头文件 解决方法 1 在被提升的类的头文件前添加本机电脑所在的相对路径 2 在被提升的类的头文件前添
  • leveldb常见问题以及性能优化点

    本篇是leveldb最后一篇 这里主要把技术核心点 性能提升点或者面试可能会被问到进行总结 一 常见问题 1 leveldb key value内存 内存中保存的是所有key value吗 答 不是 搜索顺序 memtable immtab
  • 利用MATLAB中的newrb函数进行函数逼近

    RBF函数在神经网络控制中较为常见 MATLAB中早已集成了一个newrb的函数 在一些场景下使用起来还比较方便 尤其是涉及到进行函数逼近的时候 参考链接 http blog sina com cn s blog 9b8d0abd0101o
  • Android Studio连接自带模拟器失败怎么办?强烈建议使用第三方模拟器(含各类模拟器下载地址)

    学习安卓开发的小伙伴必然会碰到模拟器的启动问题 就算成功启动Android Studio自带的模拟器 使用起来也是十分缓慢 有时候卡起来是真想骂娘 服了他个老六 那么这个时候 如果有一个第三方模拟器 不仅简单好用 无需配置 而且美观快速零卡
  • 华为存储特性

    华为存储特性 1 SmartPartition SmartPartition是一种性能特性 根据不同业务特点分配存储系统的缓存资源来满足不同应用系统的服务质量要求 由于单个存储系统要面对的应用数量急剧增加 且各业务应用之间的I O特征不同
  • Android-第五节Menu菜单详解

    目录 一 Menu背景 二 Menu使用步骤 1 创建menu 2 设计menu 3 重写menu逻辑代码 4 运行效果 一 Menu背景 手机毕竟和电脑不同 它的屏幕空间非常有限 因此充分地利用屏幕空间在手机界面设计中就显得非常重要了 如
  • STM32 使用TIM2_CH1(PA15) 输出10K PWM信号

    PA15 gt TIM2 Remap CH1 1 apb init RCC APB1PeriphClockCmd RCC APB1Periph TIM2 ENABLE RCC APB2PeriphClockCmd RCC APB2Perip
  • JMM java内存模型

    java内存模型 即 java memory model 它定义了主存 工作内存抽象概念 底层对应着 CPU 寄存器 缓存 硬件内存 CPU 指令优化等 JMM 体现在以下几个方面 原子性 保证指令不会受到线程上下文切换的影响 可见性 保证