java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度

一、前言

在java多线程编程中,volatile可以用来定义轻量级的共享变量,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度。所谓知己知彼、百战不殆。本文从JVM内存模型角度,探讨volatile的实现原理。在明白了volatile的实现原理后,再回过头来使用它,会有一种一览众山小的感觉吧,使用起来会更加得心应手。

二、Java内存模型(JMM)

1、并发编程关键问题

多线程编程涉及到两个关键问题,线程之间的通信与同步。通信是指线程之间传递信息,同步是指控制线程操作的执行顺序。通过共享内存或者消息通知这两种方法,可以实现通信或同步。基于共享内存的线程通信是隐式的,线程同步是显式的;而基于消息通知的线程通信是显式的,线程同步是隐式的。JAVA是前者,即基于共享内存的隐式线程通信、显式线程同步。

2、happens-before模型

JMM呈现给程序员的模型是happens-before模型,即:

顺序规则:(单)线程中的写操作的结果,happens before于于任意后续操作。

锁规则: 锁的解锁,happens before于于锁的获取或加锁。

volatile变量规则:volatile写操作,happens before于后续该变量的读操作是可见的。

传递性:A操作happens before于B操作,B操作happens before于C操作,则A操作happens before于C操作

这儿的happens-before,并不是指操作先于后续操作执行,而是指操作结果对于后续结果是可见的。

3、可见性

在JMM中,每个线程的内存由两层构成:线程的“本地内存”、“主内存”。“本地内存”是JMM的一个抽象,本身是不存在的,它包括缓存、寄存器、写缓冲区、编译器及CPU的优化等。共享变量存放在“主内存”中,“本地内存”中存放的是共享变量的副本。当线程中发生对共享变量的写操作时,并不是直接写到“主内存”中的,而是先写到“本地内存”的写缓冲区中,只有当刷新(flush)到主内存后,才可能被其它线程加载到其“本地内存”中,此时我们说该共享变量是对其它线程“可见”的,反之如果没有刷新(flush)到主内存,就是对于其它线程“不可见”的。

JMM就是通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供可见性的保证的

三、volatile类型的内存语义

happens-before规则提供了对volatile变量可见性的保证,即volatile变量的写操作,对后续任意对该变量的读操作是可见的。

四、volatile类型的JMM实现

再深入一些,JMM是如何实现happens-before模型中的volatile规则的呢?是通过限制这两种操作的重排序实现的。

重排序规则

第二个操作

第一个操作

volatile读

volatile写

普通读/写

volatile读

禁止重排序(1)

禁止重排序(2)

禁止重排序(3)

volatile写

禁止重排序(4)

禁止重排序(5)

-

普通读/写

-

禁止重排序(6)

-

(1) 第一个操作是volatile读时,不可以重排序,否则读出来的结果,可能是被修改过了的。

(2)(5)(6),第二个是volatile写时,所有操作都不可以被重排序于其后面,因为要确保其写的结果对于后续操作可见。

五、volatile类型使用的注意事项

多个volatile操作或复合操作,整体上不具有有序性

适用于对volatile变量的写操作很少而读操作很多的环境

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

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

相关文章

寒武纪芯片创始人:要让AI芯片计算效率提高一万倍

来源: 传感器技术 概要:随着利好政策的不断出台以及行业的持续发展,芯片相关产业站上风口。 随着利好政策的不断出台以及行业的持续发展,芯片相关产业站上风口。而AI芯片独角兽公司寒武纪,也即将入驻雄安新区。e公司记…

SQL模糊查询语句和Escape转义字符

来源:http://www.cnblogs.com/amylis_chen/archive/2010/07/16/1778921.html 通配符 描述 示例 % 包含零个或更多字符的任意字符串。 WHERE title LIKE %computer% 将查找处于书名任意位置的包含单词 computer 的所有书名。 _(下划线) 任何…

JAVA格式化同一天时间间隔_java中时间格式化怎么去时间间隔值

java中时间格式化怎么去时间间隔值关注:61 答案:2 mip版解决时间 2021-01-12 11:52提问者眼泪↓流到叻心里2021-01-11 20:30比如2015-02-03 13:25:55 与 2015-02-04 15:25:55 之间的时间间隔怎么获取最佳答案二级知识专家守給你的承諾2021-01-11 21:46转换成秒-相减取绝对值。…

超美国11倍!麦肯锡176页报告解读数字中国领先全球的秘密

来源:智东西 概要:到2030年,数字化将转变并创造高达45%的行业总收入。 12月4日,麦肯锡发布了长达176页的中国数字经济报告。 报告显示,中国电子商务(2016年交易额占全球40%)和数字支付&#xf…

SQL Server查询中特殊字符的处理方法

来源:http://database.51cto.com/art/201009/227766.htm SQL Server查询中,经常会遇到一些特殊字符,比如单引号“”等,这些字符的处理方法,是SQL Server用户都应该需要知道的。 我们都知道SQL Server查询过程中&…

JAVA发送邮件工具包_java mail 发送邮件工具包

Java测试发送邮件的时候经常出现异常,检查多次账户名密码无误后,依然出现如下图错误: 之前不清楚,后面在网上得到提醒,我们所使用的smtp服务器使用的密码与我们自身登录网页端邮箱的密码是不一样的,以163邮…

卡内基梅隆大学提出基于学习的动作捕捉模型,用自监督学习实现人类3D动作追踪

原文来源:Cornell University Library 作者:Hsiao-Yu Fish Tung、Hsiao-Wei Tung、Ersin Yumer、 Katerina Fragkiadaki 「雷克世界」编译:我是卡布达、哆啦A亮 目前,从单摄像头中进行动作捕捉(motioncapture&#xff…

session过期时间控制的一些常用方法

来源:http://blog.csdn.net/luo_yifan/article/details/4659392 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session。 具体设置很简单&#xff1a…

java 昵称1到32位字符_Java期末考试编程题复习

在程序中定义Person类&#xff0c;为该类编写如下字段、构造器、访问器、修改器和相应的其他方法。(20分)<1>在Person类中定义两个字段&#xff1a; 私有访问权限&#xff0c;类型为String的name字段&#xff1b; 私有访问权限&#xff0c;类型为int的age字段。<2>…

AI智商评测标准专家研讨会邀请,2018年12月20日北京

21世纪以来&#xff0c;人工智能领域陆续爆发很多重要事件。其中最吸引人们眼球的&#xff0c;当属2016年战胜了人类围棋冠军并开始能够从0自我学习的AlphaGo。 10月26日&#xff0c;软银CEO孙正义在沙特阿拉伯举行的未来投资计划大会上称&#xff0c;未来30年内AI的智商&#…

java代码pingip_java程序ping IP

package com.fdway.tool;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;/**** ping IP地址检查IP地址能否可用**/public class PingIPUtil {public static void main(String[] args) throws IOExce…

HTML 显示特殊字符时转义操作

/*** 转换 HTML 特殊字符*/public static String escape( String s ){if( StringUtils.isBlank( s ) ){return " ";}StringBuilder sb new StringBuilder( s.length() );for( int i 0 ; i < s.length() ; i ){char c s.charAt( i );switch( c ){case < : sb…

开源神经网络框架Caffe2全介绍

本文作者吴逸鸣&#xff0c;整理自作者在GTC China 2017大会上的演讲&#xff0c;首发于作者的知乎文章。 我个人认为这是一份很值得分享的资料&#xff0c;因为 这应该是第一次使用全中文来讲解Caffe2和FB的AI应用的演讲 观看这次演讲不需要机器学习&#xff0f;神经网络&…

JAVA设置jscrollbar大小_JScrollBar垂直/水平设置问题 – Java Swing

下面是我上面提到的一个小的可编辑代码片段.我同意camickr你不应该使用绝对定位而是使用布局管理器.如果你绝对需要为JTextField提供一个水平滚动条,那么让它工作的一种方法就是让它始终显示,使用允许这个的JScrollPane构造函数.即,JScrollPane inputPane new JScrollPane(inp…

TPTP(Java Profiling Tools插件)对Java程序进行性能测试

来源&#xff1a;http://blog.csdn.net/wsj19890201/article/details/5492517 TPTP下载地址&#xff1a;http://www.eclipse.org/tptp/ 概述&#xff1a;Eclipse Test & Performance Tools Platform (TPTP) 的性能测试工具 (Profiling tool)能够用于优化eclipse插件应用、…

AI指数评论:提防“路灯谬误”,开启全球多方对话

来源&#xff1a;亿欧 概要&#xff1a;技术的单点突破&#xff0c;资本市场的多级繁荣&#xff0c;诸如此类的话题充斥着过去两到三年。然而&#xff0c;在AI时代思考AI&#xff0c;我们需要更宏大的世界观。 技术的单点突破&#xff0c;资本市场的多级繁荣&#xff0c;诸如此…

算法还是算力?周志华微博引爆深度学习的“鸡生蛋,蛋生鸡”问题

来源&#xff1a;AI科技大本营上周&#xff0c;由强化学习加持的AlphaZero&#xff0c;把DeepMind在围棋上的突破成功泛化到其他棋类游戏&#xff1a;8小时打败李世石版AlphaGo&#xff0c;4小时击败国际象棋最强AI——Stockfish&#xff0c;2小时干掉日本象棋最强AI——Elmo&a…

java求平均值Scanner_Scanner的一些问题

import java.util.Scanner;public class 无参带返回值方法的使用 {public static void main(String[] args) {// 创建名为hello的对象无参带返回值方法的使用 hello new 无参带返回值方法的使用();// 调用hello对象的calcAvg()方法&#xff0c;并将返回值保存在变量avg中doubl…

WeakHashMap

来源&#xff1a;http://hecc-cqut.iteye.com/blog/984235 在广大的Java界&#xff0c;关于WeakHashMap一直都存在这么个传说&#xff1a; Java代码 在WeakHashMap 中&#xff0c;当某个键不再正常使用时&#xff0c;自动移除其条目 在WeakHashMap 中&#xff0c;当某个键不再…

计算机视觉大规模爆发,6大细分领域将撑起725亿元市场

来源&#xff1a;中国经济时报概要&#xff1a;近几年来&#xff0c;随着技术的发展&#xff0c;中国计算机视觉行业发展迅速。近几年来&#xff0c;随着技术的发展&#xff0c;中国计算机视觉行业发展迅速。尤其是2016年下半年&#xff0c;1∶N人脸识别、视频结构化等计算机视…