翻译自wiki百科:https://en.wikipedia.org/wiki/Java_memory_model

  没找到直接在wiki上编辑中文的页面,我就在这翻译下,自己学习用。

  java内存模型描述了线程在java编程中如何和内存交互。连同单线程执行代码描述,这个内存模型提供java编程语言的含义。

  原始的java内存模型是在1995年发展的,被广泛看作破坏,阻止很多运行时的优化的并且对代码安全不提供足够强的保证的。

  环境

   java 编程语言和平台提供线程功能。线程之间的同步对开发者很难理解。难点在于java应用程序可以在很多的处理器和操作系统上运行。为了可以总结出一个程序的行为,java的设计者决定清楚的定义所有程序可能的行为。

  在现代的平台上,编写完的代码通常是没有被执行的。它被编译器,处理器和内存系统重新整理以达到最高的性能。一个多处理器的架构,单独的处理器们必须有它们自己的和主内存不同步的本地缓存。要求多线程保持完美的同步通常是不受欢迎的,因为它通常是很消耗性能的。这意味着在一定的时间里不同的线程中同一共享内存也许会有不同的值。

  在单线程环境中,很容易解释代码的执行。传统的方法要求系统实现单线程独立的“as-if-serial”语义。当一个独立的线程执行的时候,它会如同顺序执行程序,即使这行行为发生的是无序的。

  如果单线程执行指令是乱序的,其他的线程也许会意识到这些指令执行是无序的即使不影响第一个线程的语意。例如考虑两个以下指令的线程,同步执行,x,y变量都被初始化为0:

Thread1  Thread2
x=1; int r1 = y;
y=2; int r2 = x;

  如果没有重排,并且线程2中读y的值为2.那么随后读取的x应该是1.因为对x的写早于对y的写。如果对写进行了重排,那么读Y可以返回2,而读取x可以返回0。

  这个java内存模型定义了多线程允许的行为,同时上面的读的情况是可能存在的。它在线程和主内存中为了达到一致和可靠的的应用产生了执行时间的约束。通过这个约束,使代码在多线程环境中执行变成了可能,即使面对动态编译器,处理器和缓存的优化。

  内存模型

  执行单线程的时候,规则很简单,java编程规范要求jvm遵守within-thread as-if-serial 的语义。这个运行时(通常是指动态编译,处理器和内存的子系统)对于引入任何有用的执行优化只要线程隔离的结果保证是准确的同时他也会有所有程序的声明顺序执行。

  对于as-if-serial 语义有一个警告:不要阻止不同的线程拥有不同的数据面。内存模型提供很清楚的关于在数据被读取时哪些值可以返回的指南。基本的原则反应了单独的操作可以乱序,只要这个线程的as-if-serial 语义没有被违反,并且线程之间通讯的行为比如获取释放一个锁,确保这些行为优先发生并对其他的线程可见。比如在释放锁之前的行为应该可以被之后回收锁后的事情是可见的并且是有序的。

  有可能这里有一个部分有序被称为happens-before order 在所有的行为通过程序执行。这个happens-before 顺序对程序顺序进行归类;如果一个动作在另外一个动作之前发生,它会在其他的在happens-before顺序中的动作之前发生。另外,释放和随后获取锁的行为组成了happens-before的连接。读被用来允许返回写的值,如果这个写是这个变量的最后一次写。

  影响

  java内存模型是第一次在流行语言中尝试复杂的内存模型。日渐流行的并发同步系统需要一个可以提供明确语义的技术和工具。从那以后对于内存模型的需要被广泛接受,像C++这些语言也开始提供。

  后续可以查看:

  Memory model(computing):https://en.wikipedia.org/wiki/Memory_model_(programming)

  Java concurrency:https://en.wikipedia.org/wiki/Java_concurrency

--------------

果然翻译的很生硬,翻完了还是不太明白这里java内存模型是什么个模型,觉得是一个保证并发线程可以按照顺序来执行的工具,可是具体怎么实现的原理还是不太清楚。

  还有一篇文章可以瞅瞅:

  http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html

  JSR 133 (Java Memory Model) FAQ

  找了一个翻译它还不错的文章:

  http://www.ticmy.com/?p=315

--------

  上面的blog还有文章解释了之前翻译的几个概念:http://www.ticmy.com/?p=425

  1.可见性--- 由于每个线程都有自己的工作空间,就看成每个线程自己在内存里面有一小段缓存吧,如果变量只是写在缓存里面,还没有写入主内存的话,其他线程是无法看到这个变量的改变的。

  2. happens before 概念:java内存模型定义很多的happens before 规则。比如:

  • An unlock on a monitor happens-before every subsequent lock on that monitor

  这个 线程里面解锁监控器的操作以及之前全部的操作对后面的获取锁的操作的线程(包括同一个线程)都可见,理解下来就像是 编译器给我听好了,这个线程里面获取解锁操作之前 所有的变量都要写入主内存了,方便后面的操作来查看了。

  还有一些实例的使用,挺好的文章,需要多瞅几遍了。

  

  

  

  

java 内存模型的更多相关文章

  1. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  2. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  3. JMM(java内存模型)

    What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more laye ...

  4. 《深入理解Java内存模型》读书总结

    概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...

  5. Java内存模型深度解析:final--转

    原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...

  6. Java内存模型深度解析:volatile--转

    原文地址:http://www.codeceo.com/article/java-memory-4.html Volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特 ...

  7. Java内存模型深度解析:顺序一致性--转

    原文地址:http://www.codeceo.com/article/java-memory-3.html 数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据 ...

  8. Java内存模型深度解析:基础部分--转

    原文地址:http://www.codeceo.com/article/java-memory-1.html 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何 ...

  9. 深入理解java内存模型系列文章

    转载关于java内存模型的系列文章,写的非常好. 深入理解java内存模型(一)--基础 深入理解java内存模型(二)--重排序 深入理解java内存模型(三)--顺序一致性 深入理解java内存模 ...

  10. Java内存模型深度解读

    Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型. 如果你想设计表现良好的并发 ...

随机推荐

  1. Xocde4与Xcode3的模板比较

    XCode 4.2.1 项目的模版截图: Single View Application This template provides a starting point for an applicat ...

  2. 延迟对象$q和供应商配置config

    1.angular总的$q和jquery中的延迟对象很类似,用法也差不多 m1.controller('meng',['$scope','$q',function($scope,$q){ var df ...

  3. 【Docker 在 windows 10 / windows 8 下安装】

    步骤: 1. 下载: a.https://github.com/boot2docker/windows-installer/releases 下载一个 windows 客户端: 安装时建议勾选:Boo ...

  4. Linux网络栈下两层实现

    http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...

  5. XAF学习笔记之-多表头设计

    空闲之余,看了下全英文的DEV 的XAF帮助文档,一半的英文我认识他,一半的英文他认识我,反正拆开成26个字母我全认识 不那么啰嗦了,先看效果 如何做:分以下几步 第一步:打开这个文件,这个文件就是X ...

  6. 数据仓储之DLL层接口设计

    一.接口设计 1.1. IBaseRepository.cs public interface IBaseRepository<T> { T Add(T entity); bool Upd ...

  7. jquery 判断checkbox是否选中几个版本的区别

    $('#checkbox1').prop('checked') - in jQuery 1.6+, usually the way to go $('#checkbox1').is(':checked ...

  8. (python) 标准模块sys和os的使用

    一.sys模块 包含了系统的相关的功能.我们来学习sys.argv,它包含命令行参数. 例子:定义了一个add函数,用来实现两个整数的相加. #! coding=utf-8 # usersys.py ...

  9. python第一天基础1-1

    win下是没有多进程的 windows:1.下载安装包 https://www.python.org/downloads/2.安装 默认安装路径:C:\python273.配置环境变量 [右键计算机] ...

  10. 扩大a标签的响应区域

    <a href="" style="display:inline-block; width: 100%;">xx</a>