1、Java内存模型

  Java虚拟机规范中试图定义一种java内存模型(java Memory Model,jmm)来屏蔽掉各种操作系统、虚拟机实现厂商和硬件的内存访问差异,以确保Java程序在所有操作系统和平台上能够实现一次编写、到处运行的效果。

1.1、工作内存和主内存

  Java内存模型规定了所有的变量都存储在主内存中。每个线程还有自己的工作内存,它保存了被该线程使用到的变量的主内存副本拷贝。线程对这些变量的操作都在自己的工作内存中进行,不能直接操作主内存和其他工作内存中存储的变量或者变量副本。线程间的变量访问需通过主内存来完成,三者关系如下:

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。

1.2、java内存交互协议

关于主内存与工作内存之间具体的交互协议,java内存模型中定义了以下8种操作来完成,虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的。

1、Lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。

2、unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定

3、read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存变量副本中

4、load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

5、use(使用):作用于工作内存的变量,它把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作

6、assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作

7、store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中以便随后的write操作使用

8、write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中

如果要把一个变量从主内存复制到工作内存,那就要顺序地执行read和load操作,如果把变量从工作内存同步回主内存,就要顺序地执行store和write操作。Java内存模型只要求上述两个操作必须按顺序执行,而没有保证连续执行。

2、对于volatile型变量的特殊规则

当一个变量定义为volatile之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的可见性是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成。

由于volatile变量只能保证可见性,在不符合以下两条规则的运算场景中,我们仍然要通过加锁来保证原子性。

1、运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值

2、变量不需要与其他的状态变量共同参与不变约束

使用volatile变量的第二个语义是禁止指令重排序优化,普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获得正确的结果,而不能保证变量的赋值操作的顺序与程序代码中的执行顺序一致。

见《Java并发编程之三:volatile关键字解析 转载》

java内存模型(netty权威指南)相关推荐

  1. Java并发指南6:Java内存模型JMM总结

    本文转自 https://www.cnblogs.com/kukri/p/9109639.html 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库 ...

  2. 《Netty权威指南》

    <Netty权威指南> 基本信息 作者: 李林锋 出版社:电子工业出版社 ISBN:9787121233432 上架时间:2014-5-29 出版日期:2014 年6月 开本:16开 页码 ...

  3. 《Netty权威指南》笔记 —— 第二十、二十一、二十二, 二十三章

    <Netty权威指南>笔记--Netty高级特性 第20章 Netty架构剖析 Reactor通信调度层 职责链 ChannelPipeline 业务逻辑编排层 关键架构质量属性 高性能 ...

  4. [201504][Netty 权威指南][第2版][李林锋][著]

    [201504][Netty 权威指南][第2版][李林锋][著] https://github.com/wuyinxian124/nettybook2 基础篇 走进 Java NIO 第 1 章 J ...

  5. netty权威指南第一章

    本章内容如下: 5种网络I/O模型的介绍 I/O多路复用的介绍 1.I/O基础入门 在Java1.4之前,Java对I/O的支持不完善,开发人员在开发高性能I/O的程序时,会面临以下问题: 没有数据缓 ...

  6. netty权威指南 学习笔记http

    序 李林峰的<netty权威指南>,从Java的NIO开始介绍,后面介绍TCP粘包拆包.中级篇介绍编解码技术. 第10章介绍了HTTP及netty HTTP+XML的技术. 因为xml实际 ...

  7. JSR 133 Java内存模型以及并发编程的最权威论文汇总

    Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.o ...

  8. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  9. Java内存模型与指令重排

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 转自 ...

最新文章

  1. 来翻翻百度的老底:当年你是怎么赢的谷歌?
  2. Android Studio 第一次配置及其使用
  3. SQLBackupAndFTP The server principal NT AUTHORITY\SYSTEM is not able to access the database xxxx
  4. Quartz表达式触发
  5. hdu 1593(数学)
  6. 华为8lite支持云闪付吗_鸿蒙系统适配机型表曝光,部分华为旗舰机未支持,你是其中之一吗...
  7. ES6新语法--对象成员简写、对象展开、数组展开
  8. 蚂蚁之江要退地?官方回应:假的
  9. tomcat集群的failover机制
  10. c语言为什么运行慢,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
  11. linux 桥接stp原理,Linux 中的网桥技术
  12. Android游戏开发LoneBall小游戏
  13. 实验五 Linux Shell程序设计
  14. springmvc(表现层/Web层框架)
  15. 2021顺丰科技实习 面经
  16. Java入门-学习黑马程序员Java基础视频教程(到P92)
  17. 净误差与遗漏为负值的含义_【双语】跳出“资本外逃”之争看净误差与遗漏
  18. 你如何破解后安装PS cs6
  19. vue+elementUI上传图片
  20. SpringBoot日志文件

热门文章

  1. Delphi十进制和十六进制互转
  2. 两个iOS应用之间的跳转
  3. 利用最新的开源软件构建日志管理系统
  4. android 开发不容错过的网站
  5. 《Ray Tracing in One Weekend》——Chapter 9: Dielectrics
  6. 问题六十三:怎么用ray tracing画sphere sweeping图形
  7. word2016 图片去底灰_几块钱买的葫芦,三四十双手套轮换用,他个个盘出玻璃底...
  8. Hive最全学习笔记总结
  9. 最流行的轻量级php框架,GitHub - meolu/zan: zan 轻量级PHP微框架
  10. hikari如何切换数据源_spring boot+mybatis 多数据源切换(实例讲解)