Java:内存模型

news2024/11/25 7:01:49

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、Java内存模型出现的背景

二、什么是Java内存模型

三、Java内存模型的底层实现

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、Java内存模型出现的背景

操作系统的优化,带来的缓存可见性问题和指令重排导致的原子性问题

这些都是操作系统的供应商为了提高系统性能,所做出的升级优化。

但是这些升级优化,恰恰在多CPU场景下,引发其他的问题。

人们在着手解决这些问题的时候,发现,不能盲目的全部禁用这些优化,因为那样的话,我们的程序就又回到了单CPU的时代,再加上锁的竞争,可能性能会更加的慢。

既然不能全部禁用,那么就灵活一些,将禁用的主动权交给编写程序的人,我们的主角即将登场——Java内存模型

二、什么是Java内存模型

Java内存模型,规范了JVM如何提供按需禁用缓存和编译优化的方法

通俗的讲,就是约定了按需禁用缓存和编译优化的关键字、方法等等

来讲两个例子,大家就知道说的是什么了,例如:修饰变量的关键字volatile、final、synchronized关键字。也就是说这些个Java的关键字,是为了禁用缓存和编译优化而生。

三、Java内存模型的底层实现

上边讲的是Java内存模型的体现形式,通过关键字,让开发人员自己控制。

那么接下来讲一讲,这些关键字的底层实现——内存屏障(memory barrier)

我们对如下语句进行反编译

synchronized (this) {
    System.out.println("Method 1 start");
}

反编译结果:

指令解释——monitorenter

Each object is associated with a monitor. A monitor is locked if and only if it has an owner. The
thread that executes monitorenter attempts to gain ownership of the monitor associated with
objectref, as follows:
• If the entry count of the monitor associated with objectref is zero, the thread enters the monitor
and sets its entry count to one. The thread is then the owner of the monitor.
• If the thread already owns the monitor associated with objectref, it reenters the monitor,
incrementing its entry count.
• If another thread already owns the monitor associated with objectref, the thread blocks until the
monitor's entry count is zero, then tries again to gain ownership

翻译成中文

每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:
1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。
2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权

指令解释——monitorexit: 

The thread that executes monitorexit must be the owner of the monitor associated with the instance
referenced by objectref.
The thread decrements the entry count of the monitor associated with objectref. If as a result the
value of the entry count is zero, the thread exits the monitor and is no longer its owner. Other
threads that are blocking to enter the monitor are allowed to attempt to do so.

翻译成中文

执行monitorexit的线程必须是objectref所对应的monitor的所有者。
指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个
monitor阻塞的线程可以尝试去获取这个 monitor 的所有权

从上可以看出,底层用了监视器锁来限制指令的重排。


总结

新事物的出现并非偶然,带着解决问题的思路去思考。

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

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

相关文章

基于C语言的贪吃蛇小游戏(简易版)

这篇博客会是对学习C语言成果的检测,为了实现贪吃蛇小游戏,我们用到的“工具”有:C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。 目录 1.简易版游戏效果 1.1欢迎界面 1.2游戏规则提示页面 1.3游戏进行页面 …

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 ,首先从基本原理图、引脚方面开始做个初步理解并整理: 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星,芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

恭喜发财!东方第一 MEME 拥抱符文

第 431 号符文 HOPE•YOU•GET•RICH 🧧,是 Omnity 首个支持的跨链 Runes 资产,也是TG群里红包小程序支持的第一个 Runes 资产。 大家可以在 Omnity 的 TG 群和 RunesCC 的 TG 群里,不定时的抢到符文红包。 Omnity TG:…

智慧监测IN!计讯物联筑牢高速滑坡预警“安全锁”

在现代社会,高速公路以其高速、便捷的特性,早已成为连接城市与地区之间的重要纽带,承载着日益增长的车流和人流。然而,随着车流量的激增,高速公路面临的运营压力和安全挑战也随之加大,其中滑坡风险尤为突出…

ArrayList线程安全问题解决方案

jdk8 Stream API的出现大大简化了我们对于集合元素的处理代码,对于串行流来说,无需考虑线程安全问题;但是,对于并行流来说,由于它是以多线程的方式并行处理同一个集合中的数据元素的,因此,存在着…

智慧交通系统:未来出行,从这里开始

随着城市化进程的加快,交通拥堵、事故频发、停车难等问题日益凸显,传统交通管理模式已难以满足现代社会的需求。智慧交通系统作为解决这些问题的关键,通过集成创新技术,实现交通管理的智能化、信息化,提高交通系统的运…

Unity射击游戏开发教程:(10)创建主界面

主界面开发 玩游戏时,主菜单是事后才想到要做的。实际上几乎每个游戏都有一个主界面。如果你点击打开游戏并立即开始游戏,你会感到非常惊讶。本文将讨论如何创建带有启动新游戏的交互式按钮的主界面/主菜单。 主菜单将是一个全新的场景。我们将添加一个 UI 图像元素,并在图像…

洗地机什么牌子最好?618高性价比家用洗地机品牌

随着科技的发展,智能智能清洁家电越来越受到消费者的欢迎。洗地机作为其中的佼佼者,已经成为许多家庭清洁的好帮手。然而,面对满目琳琅的洗地机品牌型号,究竟哪一款机型适合家用呢,正好618也临近了,又有哪些…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

5.7代码

1.环境治理 分析:最开始进入了一个误区,觉得都有通路了直接算通路就可以,后来才发现居然是最小路径的总和,所以大概是每减一次都要算一次各点之间的最小路径了,然后是循环,到需要的条件为止 总的来说思路不…

通过颜色学习css

文章目录 1.生成html2.添加css链接3.将h1标签text-align元素4.添加div标签4.1、为类marker添加元素4.2、添加两个新的div标签4.3、修改div标签的类型并修改css元素4.4、为类container添加元素4.5、以数字形式添加颜色4.5、container添加padding属性4.6、组合css中的颜色属性4.7…

SG-8018CE晶体振荡器可编程规格书

SG-8018CE系列晶体振荡器是一个高性能、多功能且具有高度集成性的解决方案,它满足了现代电子系统的严格要求。其广泛的频率范围0.67 MHz到170 MHz,且频率调节精度达到1ppm,1.62 V至3.63V的宽广电源电压,使能(OE&#x…

【notepad++】使用

1 notepad 下载路径 https://notepad-plus.en.softonic.com/download 2 设置护眼模式 . 设置——语言格式设置——前景色——黑色 . 背景色——RGB :199 237 204 . 勾选“使用全局背景色”、“使用全局前景色” . 保存并关闭

一致性评价政策加速行业仿制药洗牌,惯爱为代表的新锐品牌崭露头角

从印度神油到以形补形,男人的问题,从古至今一直困扰着很多人,大多人都羞于启齿。然而,沉默的背后,隐藏着令人震惊的数据:据统计显示,ED(勃起功能障碍)是男性生殖系统发病…

3d模型实体显示有隐藏黑线?---模大狮模型网

在3D建模和设计领域,细节决定成败。然而,在处理3D模型时,可能会遇到模型实体上出现隐藏黑线的问题。这些黑线可能影响模型的视觉质量和呈现效果。因此,了解并解决这些隐藏黑线的问题至关重要。本文将探讨隐藏黑线出现的原因&#…

免收隔夜费的外汇平台特点与选择

外汇交易是一种全球范围内的投资活动,参与者包括银行、机构投资者、交易商和个人交易者。在外汇交易中,隔夜费(也称为掉期费或展期费)是当持仓过夜时,因货币对利率差异而产生的费用。这种费用对一些交易者,…

操作系统实战(二)(linux+C语言)

实验内容 通过Linux 系统中管道通信机制,加深对于进程通信概念的理解,观察和体验并发进程间的通信和协作的效果 ,练习利用无名管道进行进程通信的编程和调试技术。 管道pipe是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道一…

知行之桥EDI系统跨平台版本安装报错及解决方案

本文将为大家介绍如何在Windows系统中安装知行之桥EDI系统跨平台版本的常见报错以及解决方案。如下图所示: 在知行软件官网的导航栏中点击 下载 按钮,即可看到知行之桥EDI系统不同版本的下载选项,点击右侧跨平台版本,选择 Windows…

uniapp-ios支付

uniapp安卓包中的微信,支付宝逻辑放在iOS测试包中也能使用. 但询问iOS开发者后得知,有支付相关功能的app要上架苹果,必须先有苹果支付,不然苹果审核不给过.甚至没有支付逻辑,但打包时有支付相关的SDK也不行,苹果会认为你偷偷做了支付逻辑,想要绕开他. 一. 去苹果开发者后台把…