在忙着参加在爱沙尼亚进行的 TEDx talk 演讲活动以及在比利时举办的一届非常忙碌的Devoxx 会议的间隙,我将继续推进 Java’s Rocking 的系列博文。
对还没有接触过这个系列博文的读者,不妨先看看这个系列文章所包含的内容。同时,这也是我个人最喜爱的Java 平台的10个优点:
这篇文章的内容是阐述第四点——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