当前位置: 首页 > 编程日记 > 正文

Java并发 -- JMM

文章基于jdk1.7,通过学习《Java并发编程的艺术》,对Java内存模型的理解

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

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

上面所说的线程指的是并发执行的活动实体。

线程之间的通信机制有两种:共享内存消息传递

  • 在共享内存的并发模型中,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信
  • 在消息传递的并发模型中,线程之间没有公共状态,必须通过发送消息来显式进行通信

同步无非就是控制不同线程的执行顺序。在共享内存的并发模型中,同步是显式进行的,程序员必须显式的指定某个方法或者某段代码需要在线程之间互斥执行。在消息传递的并发模型中,同步是隐式的,因为消息的发送必须在消息的接收之间。

Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行的,整个通信过程对程序员完全透明。

Java内存模型的抽象结构

在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量和异常处理器参数不会在线程之间共享,它们不会有内存可见性问题,也不会受内存模型的影响。

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

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

JMM的抽象示意图如下:

从上图来看,如果线程A和线程B要通信的话,需要经过两个步骤:

  • 线程A把本地内存A中更新过的共享变量刷新到主内存中去
  • 线程B到主内存中去读取线程A之前已更新过的共享变量

JMM通过控制主内存和每个线程的本地内存之间的交互,来为Java程序实现内存可见性的保证。

JMM和JVM的区别

JMM中的主内存、工作内存与JVM中的Java堆、栈、方法区等并不是同一个层次的内存划分,这两者基本上是没有关系的,如果两者一定要勉强对应起来,那从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域。从更底层次上说,主内存就直接对应于物理硬件的内存,而为了获取更好的运行速度,虚拟机(甚至是硬件系统本身的优化措施)可能会让工作内存优先存储于寄存器和高速缓存中,因为程序运行时主要访问读写的是工作内存。

欢迎关注我的公众号哦~

搜索公众号:翻身码农把歌唱 或者 扫描下方二维码:

相关文章:

开源!mathAI手写拍照自动能解高数题,还不快试试?

作者 | 红色石头转载自 AI有道(id:redstonewill)让我们不妨先来盘点下从 2016 年起过去三年间 Google I/O 开发者大会亮相的重磅 AI 产品:深度好玩!文章开始红色石头先在草稿纸上写一道高数微积分题目给大家看看如何求解&#xf…

黄聪:IE6下用控制图片最大显示尺寸

div img { max-width:600px; width:600px; width:expression(document.body.clientWidth>600?"600px":"auto");overflow:hidden; } ◎ max-width:600px; 在IE7、FF等其他非IE浏览器下最大宽度为600px。但在IE6中无效。 ◎ width:600px; 在所有浏览器中…

漫画:有趣的海盗问题 (完整版)

————— 第二天 —————海盗分金币问题:有5个海盗,获得了100枚金币,于是他们要商量一个方法来分配金币。商议方式如下:1. 由5个海盗轮流提出分配方案。2. 如果超过半数海盗(包括提出者)同意该方案&…

【Qt】error: undefined reference to `vtable for MainWindow‘

1、问题描述 在写一个demo时,想尽量简单,就把MainWindow类的定义和实现都写在main.cpp中,结果编译时报错: main.cpp:-1: error: undefined reference to `vtable for MainWindow :-1: error: collect2.exe: error: ld returned 1 exit status2、原因分析 错误信息vtable…

Sql Server:创建用户并指定该用户只能看指定的视图

1,在sql server中选择好要操作的数据库2,--当前数据库创建角色 exec sp_addrole seeview--创建了一个数据库角色,名称为:[seeview]3,--分配视图权限 GRANT SELECT ON veiw TO [角色] --指定视图列表 指定seeview这个角色可以查看的视图表名称&#xff1…

10 款可以找回删除文件的好软件

电脑突然死机或者断电,硬盘数据丢失?U盘重要文件不小心删掉了? 电脑中毒,文件丢失或无法读取? 系统突然崩溃,重要文件丢失?使用计算机最怕的就是象以上这些突如其来的灾难性故障导致重要数据的丢失,误操作、计算机病毒的***和软、硬件故障等天灾人祸…

万万没想到,逛B站也能学编程了

作者 | 徐麟,某互联网公司数据分析狮转载自 | 数据森麟(id:shujusenlin)前言很多人提到B站,首先想到的就会是二次元或者鬼畜,上个月,我们公众号也发表了一篇关于B站鬼畜视频的文章:《…

【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo

1、简介 使用的主要类:QGraphicsTextItem、QGraphicsScene、QGraphicsView。 QGraphicsTextItem继承自QGraphicsObject,而QGraphicsObject继承自QObject和QGraphicsItem; QGraphicsItem可以是2D曲面上的图形项目,例如线条,矩形,文本甚至自定义项目,本例中演示的文本QGr…

国产海翼号水下滑翔机首次应用于北极科考

中国第九次北极科学考察队7月28日在白令海公海区域成功布放我国自主研发的“海翼”号水下滑翔机。这是我国自主研发的水下滑翔机首次在白令海布放,也是首次应用于中国北极科考。 北京时间28日5时23分,考察队队员们将“海翼”号水下滑翔机缓缓送入海中。在…

高性能网站性能优化与系统架构(ZT)

转载请保留出处:俊麟 Michael’s blog (http://space.itpub.net/7311285/viewspace-97) 我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自…

非常全面的AutoML资源,看这个就够了!

整理 | Rachel责编 | 琥珀出品 | AI科技大本营(id:rgznai100)深度学习的发展促进了相关应用的涌现。但是,深度学习模型往往具有非常大的参数搜索空间,为了保证模型的效果,经常需要机器学习专家耗费大量的时…

【Qt】Qt再学习(十二):QGraphicsItem

1、简介 QGraphicsItem是用于场景QGraphicsScene中在所有图形项的基类,它是一个纯虚类,不能直接使用。子类化QGraphicsItem后,需要重新实现图形项的几何形状、碰撞检测、绘画实现、事件处理。 常用图形项: 类名图形项QGraphicsEllipseItem椭圆QGraphicsLineItem直线QGrap…

一堆乱七八糟绝不正经的排序算法

原文 索引 猴子排序 钻石排序(戴蒙德排序) 恶魔排序 珠排序 地精排序(怂货排序) 智能设计排序 1. 猴子排序 (提供者cy1306110516) 猴子排序的思想源自于著名的无限猴子定理。 既然猴子们能敲出《哈姆雷…

好久没有更新了!

好久没有更新博客了,主要是因为本人在从事信息化监理行业,遇到了困惑的事情,不时地在问自己,选择这个行业,对吗? 从事这个行业,已经换了两家公司,对于信息化监理事业却秉承不同的理念…

多人开发情况下的字符串本地化

项目开发中,独立开发的还是少数。经常会有多人开发的情况,这种情况,如果多人同时操作本地化文件,极有可能会存在冲突。另一方面,我们又不希望自己的本地化文件受到对方的污染,也就是说,我们不希…

【Ubuntu】制作usb启动盘安装ubuntu18.04时报错:“failed to load ldlinux.c32”

1、问题描述 使用UltraISO制作ubuntu18.04操作系统的usb启动盘后,按照时报错: failed to load ldlinux.c32ubuntu16.04、ubuntu14.04没有遇到这个问题。 2、原因 未知 3、解决方法 参考博客 https://blog.csdn.net/tnaig/article/details/81139887…

清华AI学堂班:姚期智担任首席教授,2019年首批招收30人

整理 | 琥珀出品 | AI科技大本营(id:rgznai100)清华流传一句话,半国英才聚清华,而清华一半英才在“姚班”。据不完全统计,自 2005 年开班至今,“姚班”已有10位毕业生进入学界执教斯坦福大学、普…

php函数get_magic_quotes_gpc详解

2019独角兽企业重金招聘Python工程师标准>>> set_magic_quotes_runtime是用来设置PHP 环境配置的变量 magic_quotes_runtime 值。 0-关闭 1-打开 程序中检测状态用get_magic_quotes_runtime,返回 0 表示关闭本功能;返回 1 表示本功能打开。若magic_quote…

掌声送给TensorFlow 2.0!用Keras搭建一个CNN | 入门教程

作者 | Himanshu Rawlani译者 | Monanfei,责编 | 琥珀出品 | AI科技大本营(id:rgznai100)2019 年 3 月 6 日,谷歌在 TensorFlow 开发者年度峰会上发布了最新版的 TensorFlow 框架 TensorFlow2.0 。新版本对 TensorFlow…

【Qt】Qt再学习(十四):QGraphicsView

1、简介 QGraphicsView提供显示QGraphicsScene的功能,它继承自QAbstractScrollArea,因此它还是一个带滚动条的窗口,这样可以实现只场景的一部分。还可以创建多个QGraphicsView来显示同一个QGraphicsScene,类似 QTableView、QTreeView和QListView的显示,官方专业的描述是“…

6月27日任务 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志

2019独角兽企业重金招聘Python工程师标准>>> 16.4 配置Tomcat监听80端口 1. vim /usr/local/tomcat/conf/server.xml Connector port"8080" protocol"HTTP/1.1" 修改为Connector port"80" protocol"HTTP/1.1" 2. /usr/loca…

Excel导入SQL数据库完整代码

protected void studentload_Click(object sender, EventArgs e){//批量添加学生信息SqlConnection conn DB.dataBaseConn();//链接数据库conn.Open();try{string fileurl typename(studentFileUpload);//调用typename方法取得excel文件路径DataSet ds new DataSet();//取得…

33关Python游戏,测试你的爬虫能力到底及格不?

作者 | 苏克1900责编 | 胡巍巍转载自高级农民工(ID: Mocun6)最近在网上看到一个非常有意思的 Python 游戏通关网站,一共有 33 关,每一关都需要利用 Python 知识解题找到答案,然后进入下一关。很考验对 Python 的综合掌…

【Qt】Qt再学习(十五):关于paintEvent、QPainter学习这一个demo就够了

1、描述 关于绘画事件paintEvent和绘制类QPainter的使用,推荐参考QtCreator中自带的示例basicdrawing。通过这个例子就能掌握QPainter的所有基本用法。下面是这个例子的几张截图:

HTTP缓存——304与200 from cache

个人博客原文地址 HTTP与缓存相关的字段 1. 通用字段 字段名称释义Cache-Control控制缓存具体的行为PragmaHTTP1.0时的遗留字段,当值为"no-cache"时强制验证缓存Date创建报文的日期时间(启发式缓存阶段所用)2. response字段 字段名称释义ETag服务器生成资…

一个多年网络工程师总结的工作实用经验

转载自:51CTO下载频道 1、 交换机选购指南l 设备基本指标:网络接口类型、用户可用插槽数、端口密度。l 设备功能指标:VLAN划分、堆叠、单播和组播协议支持、可网管。l 设备性能指标:背板带宽、包转…

【Qt】Qt再学习(十六):QObject::connect: Cannot queue arguments of type ‘QString‘

1、问题描述 跨线程使用信号和槽时,如果是非const的引用传参,就会报如下的错误: QObject::connect: Cannot queue arguments of type QString& (Make sure QString& is registered using qRegisterMetaType().)2、测试示例 #include <QCoreApplication>

微软提出极低资源下语音合成与识别新方法,小语种不怕没数据!| ICML 2019

作者 | 谭旭转载自微软研究院AI头条&#xff08;ID: MSRAsia&#xff09;编者按&#xff1a;目前&#xff0c;人类使用的语言种类有近7000种&#xff0c;然而由于缺乏足够的语音-文本监督数据&#xff0c;绝大多数语言并没有对应的语音合成与识别功能。为此&#xff0c;微软亚洲…

面试准备--7.31

22222转载于:https://www.cnblogs.com/czlovezmt/p/9398015.html

那些年,让我面试头大的几个排序算法,今天终于搞懂了!

作者 | 逆流的鱼yuiop转载自何俊林&#xff08;ID:smartyuge&#xff09;算法上&#xff0c;最基础的就是排序算法&#xff0c;几乎在面试中&#xff0c;或多或少会要求你手写一些基础算法。今天鱼哥带大家这些基础算法回顾下。快速排序介绍&#xff1a;快速排序&#xff08;Qu…