简述Java内存模型的由来、概念及语义
为什么需要Memory Model
旧有JMM的问题
class String {static final char[] charArray;static int length;static int offset; // 表示字符串的开始位置 }
charArray数组以及length、offset可以在多个String/StringBuffer中共享。比如 String.substring()就是共享了原有String的charArray。
String s1 = "/usr/tmp"; String s2 = s1.substring(4); // contains "/tmp"
在旧有JMM中,没有synchronization。初始化s1的时,object的构造器将length/offset初始化为0,此时其他线程可以访问这些值(这个时候使用substring明显就有问题),接下来String的构造器为length/offset赋值为需要的值。新JMM模型解决了final变量在构造器中初始化时的线程安全问题,即:final变量在初始化之前(构造函数执行完毕之前)是不允许其他线程可见的。
Map configOptions; char[] configText; volatile boolean initialized = false; . . . // In thread A configOptions = new HashMap(); configText = readConfigFile(fileName); processConfigOptions(configText, configOptions); initialized = true; . . . // In thread B while (!initialized) sleep(); // use configOptions ,在旧有JMM中,这里并不保证configOptions已经初始化,因为变量顺序可能已经重排。
新的JMM
class A {final Map<String,String> map=null;public void A(){map = new HashMap<String,String>();map.put("key1","value1");} }
Refs
简述Java内存模型的由来、概念及语义相关推荐
- 程序员写好技术文章的几点小技巧,简述java内存模型面试
开头 该文档在Github上收获5K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识.Java集合.JVM.多线程并发.spring原理.微服务.Netty 与R ...
- 什么是Java内存模型?为什么会引发线程安全问题?
近日,有热心市民就 "Java内存模型 " 提出质疑: 线程是否会把所有需要操作的数据全加载到内存 根据<我是憨包>可以看出,当事人蛋蛋(化名)目前情绪稳定,并且似乎 ...
- 彻底理解Java内存模型,它为什么会引发线程安全问题【吐血总结】
近日,有热心市民就 "Java内存模型 " 提出质疑: 线程是否会把所有需要操作的数据全加载到内存 根据<我是憨包>可以看出,当事人蛋蛋(化名)目前情绪稳定,并且似乎已 ...
- JMM Java内存模型的概念以及happens-before原则
详细介绍了JMM Java内存模型的概念.由来,以及happens-before原则的具体规则. Java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的一组规范以及机 ...
- 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念
本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...
- 循序渐进:带你理解什么是Java内存模型
近期笔者在阅读<深入理解Java虚拟机:JVM高级特性与最佳实现(第3版)>,书中提到关于Java内存模型的知识点,但是看完之后还是感觉有些模糊,便查阅一些其他相关资料.本文是笔者经过对知 ...
- Java高并发编程(三):Java内存模型
1 Java内存模型的基础 在并发编程里,需要处理两个问题: 线程之间如何通信 线程之间如何同步. 通信指的是线程之间以何种机制来交换信息.在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传 ...
- blp模型 上读下写_Java高并发编程(三):Java内存模型
1 Java内存模型的基础 在并发编程里,需要处理两个问题: 线程之间如何通信 线程之间如何同步. 通信指的是线程之间以何种机制来交换信息.在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传 ...
- 01.java内存模型
文章目录 1. 简述 2. JAVA 内存模型的规则 2.1. 对线程的非共享变量不做任何处理 2.2. 线程共享变量提供同步机制 2.2.1 同步顺序 2.2.2. HAPPENS-BEFORE 参 ...
最新文章
- Bootstrap4.x 新增
- UNIX再学习 -- 网络IPC:套接字
- Delphi Menu Designer(菜单设计器)之一
- java mysql failover_mysqlfailover测试
- android system window,Android之属性fitsSystemWindows
- [Flex]Flex 3.0 and Adobe AIR 1.0正式版发布!
- SocketType 枚举----指定 Socket 类的实例表示的套接字的类型
- c++之按距离某点的距离排序
- Eclipse_设置JSP模板
- 玩转华为ENSP模拟器系列 | 配置URPF示例
- 数据结构(四):KD树
- p39最大子数组问题o(lgn)
- recover的用法
- ACwing 1018 最低通行费
- 小白从0学习推荐系统 ---01 推荐系统简介
- 派克Parker耐高低温伺服电机在汽车检测行业中的重要应用
- error C2248: “CObject::CObject”: 无法访问private 成员(在“CObject”类中声明)
- CAD文件怎么转成低版本?教你两个小妙招
- 【券后价9.90元】【包邮】荷叶茶冬瓜荷叶茶叶纯干玫瑰花茶袋泡花草茶包组合天然决明正品子...
- linux 硬盘对拷,比ghost好用