本文由 ImportNew - 靳禹 翻译自 zeroturnaround。如需转载本文,请先参见文章末尾处的转载要求。

在忙着参加在爱沙尼亚进行的 TEDx talk 演讲活动以及在比利时举办的一届非常忙碌的Devoxx 会议的间隙,我将继续推进 Java’s Rocking 的系列博文。

对还没有接触过这个系列博文的读者,不妨先看看这个系列文章所包含的内容。同时,这也是我个人最喜爱的Java 平台的10个优点:

  • Java编译器
  • Core
    API
  • 开源
  • Java内存模型
  • 高性能虚拟机(VM)
  • 字节码(Bytecode)
  • 聪明的IDE
  • 性能分析工具
  • 向后兼容性
  • 成熟与创新

这篇文章的内容是阐述第四点——Java内存模型。

Java 内存模型强在哪里

并行计算已成为当前提高计算能力的必由之路。于此相对应的,多年来对于并发的使用也已经在各种程序中变得不可或缺。甚至这种对并发的应用仅仅是在程序中使用了一个处理事件分发的线程。但即便如此,应用程序也需要对内存的变化有一个完整、一致的视图。正是这样的视图确保了不同程序在内存中写入的数据对于其他线程或者进程是可见的。而处理器和内存模型所提供的访问控制正是实现上述视图所需要的。

Java虚拟机在独立于硬件的层面上更进一步地实现了自有的内存模型。基于此,Java 相对于其他编程语言(诸如 Perl、Python和Javascript)在处理并发原语时,并不需要依赖于任何外部的库,而是直接在Java虚拟机的内核中进行处理。这种对并发的控制可以被应用于任何需要协作或保持数据一致性的场景中。Java内存模型使得Java语言本身、编译器、Core API可以有一个统一的设计,并以此来保证Java可以提供一个处理并发操作以及状态共享的可靠基础。

实践出真知

尽管Java早在1.0版就引入了内存模型,但在早期版本中存在着一些严重的问题.。Java社区就此分析了JSR-133 中提及的改进需求,经过了后续几年的艰苦工作,于2004年随着J2SE(1.5版本)的发布推出了我们现在所熟悉的那个健壮的Java内存模型和处理并发API。自此之后,还没有出现过需要进行重新设计才能解决的重大问题。

Java是最早提供这种完善的多线程模型的编程语言。而现在,这种标准化的内存语义已经被整个行业所认可。正是看到了Java在内存模型上的成功,C++和C在2011年发布的第11版中首次加入了其原生的内存模型。

让并发的程序正确的运行并不是一件简单的事情。幸运的是,在今天我们有不同方案来应对并发环境中的各种问题。除了运用线程来进行并发处理,基于行动者(Actor)模型的并发实现也许符合当前对于并发实现的需要。除此之外,其他可选的并发模型还包括软件事务存储模型、Fork/Join(创建子进程/等待进程退出) 或者多种不同的同步锁实现。

选择一个最适合你项目的并发方案非常简单,你无需考虑编译器、硬件和依赖库是不是对你选择的并发方案兼容。这是因为所有这些不同解决方案的实现全部基于Java内存模型,而Java内存模型提供了解决并发问题的基础。有了这些基础,选择一个适合的技术就变得容易多了。

扩展阅读

如果你想更进一步了解Java内存模型的内部工作机制和其所提供的便利,下面的链接或许对你有帮助。

感谢您的阅读. 欢迎在 Twitter 上给我留言 @gbevin. 请关注 Java’s Rocking 系列第五篇: 高性能虚拟机!

原文链接: zeroturnaround 翻译: ImportNew.com靳禹
译文链接: http://www.importnew.com/7526.html

Java 10大优点—Part4—Java内存模型的更多相关文章

  1. Java解决大文件读取的内存问题以及文件流的比较

    Java解决大文件读取的内存问题以及文件流的比较 传统方式 读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如 ...

  2. Java 运行时数据区和内存模型

    运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ...

  3. JAVA高级篇(二、JVM内存模型、内存管理之第二篇)

    本文转自https://zhuanlan.zhihu.com/p/25713880. JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充 ...

  4. Java 10大精华文章收集001

    Java语言与JVM中的Lambda表达式全解 Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍 ...

  5. JAVA高级篇(二、JVM内存模型、内存管理之第一篇)

    JVM内存结构如 Java堆(Heap),是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实 ...

  6. java并发编程(9)内存模型

    JAVA内存模型 在多线程这一系列中,不去探究内存模型的底层 一.什么是内存模型,为什么需要它 在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调: 想要确保每个处理器在任意时刻知道 ...

  7. 【Java并发】线程安全和内存模型

    一.概述 1.1 什么是线程安全? 1.2 案例 1.3 线程安全解决办法: 二.synchronized 2.1 概述 2.2 同步代码块 2.3 同步方法 2.4 静态同步函数 2.5 总结 三. ...

  8. Java锁(一)之内存模型

    想要了解Java锁机制.引发的线程安全问题以及数据一致性问题,有必要了解内存模型,机理机制了解清楚了,这些问题也就应声而解了. 一.主内存和工作内存 Java内存模型分为主内存和工作内存,所有的变量都 ...

  9. 面试10大算法汇总——Java篇

    问题导读 1 字符串和数组 2 链表 3 树 4 图 5 排序 6 递归 vs 迭代 7 动态规划 8 位操作 9 概率问题 10 排列组合 11 其他 -- 寻找规律 英文版 以下从Java角度解释 ...

  10. JAVA并发编程的艺术 JMM内存模型

    锁的升级和对比 java1.6为了减少获得锁和释放锁带来的性能消耗,引入了"偏向锁"和"轻量级锁". 偏向锁 偏向锁为了解决大部分情况下只有一个线程持有锁的情况 ...

随机推荐

  1. 搭建MyBatis环境

    开发环境 idea .maven .MySQL.MyBatis MySQL不同版本的注意事项 1.驱动类driver-class-name MySQL 5版本使用jdbc5驱动,驱动类使用:com.m ...

  2. 调用ArrayList的add方法抛异常UnsupportedOperationException

    调用ArrayList的add方法抛异常UnsupportedOperationException 对于一些想要把数组转成List的需求,可能会使用到Arrays.asList()获取List对象,但 ...

  3. Identity – Without Identity Framework

    前言 上一回研究 Authenticate 和 Authorization 已经是 2 年前了. 业务需求一直没有增长, 所以也没有再去提升它了. 但最近业务开始上去了. 荒废的功夫又得拾起来了. 上 ...

  4. Maven高级——私服(Nexus)

    私服 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题 Nexus Sonatype公司的一款maven私服产品 下载地址(需要魔法):nexus-3.49.0-02-win64.zi ...

  5. Libevent学习-源码下载和交叉编译,示例代码运行

    1. 官网 2. 交叉编译 我的当前环境 mips平台交叉编译说明 先解压下载后的libevent源码压缩包然后cd进入解压后的文件夹libevent-2.1.11-stable: <1. ./ ...

  6. java基础 -反射笔记

    710,反射快速入门 代码: 先创建一个 re.properties 文件: classfullpath=com.hspedu.Cat method=hi Cat.java package com.h ...

  7. Java项目笔记(二)

    一.分页待解决的问题 分页是在service层实现的 在controller层和service层同时写了这句代码 PageHelper.startPage(Integer.valueOf(pageNo ...

  8. 《Vue.js 设计与实现》读书笔记 - 第5章、非原始值的响应式方案

    第5章.非原始值的响应式方案 5.1 理解 Proxy 和 Reflect Proxy Proxy 只能代理对象,不能代理非对象原始值,比如字符串. Proxy 会拦截对对象的基本语义,并重新定义对象 ...

  9. 称骨算命免费api接口_json数据接口示例_八字称骨测算程序php接口

    称骨算命是算命方法的一种,和生辰八字算命.紫微斗数算命异曲同工,略有不同,虽然都是用出生的时间算命,但比较而言,称骨算命将命运分的比较粗略,只是把命运分为五十一种.故对命运的考察不细致,不太准确,可以 ...

  10. 树形结构数据 数组对象 按照 sort 字段排序

    export function sortTreeData (data, flag) { let arr = [] if (flag === 1) { arr = data[0].children } ...