译《The Java Memory Model》

这是JEREMY MANSON的博士论文《The Java Memory Model》的翻译,他是JSR-133(java内存模型与线程规范)的作者之一,换句话说,本文是Java内存模型的理论基础。

摘要

多年来,对多线程的支持已经集成到主流语言中,因此,需要解释线程如何通过内存进行交互的。
开发者可以简单明了地知道,当他们的程序执行时可能会发生什么。编译器编写者也可以尽情地发挥,并能够保证不会影响使用的程序员。
Java的原始的线程规范,内存模型,从根本上是有缺陷的。一些语言特性,如volatile字段,如果根据规范,它们的处理方式会非常薄弱,以至于几乎无用。其他功能,包括没有访问修饰符的字段,也被过度规范,导致内存模型会阻碍几乎所以代码的优化,包括正常字段。
最后,一些特性,如final字段,除了普通字段之外没有任何规范,也没有提供关于运行时会发生什么的保证。
本论文的工作试图弥补这些限制。我们提供了一个清晰简洁的线程交互定义。它对程序员来说足够简单,并且足够灵活,可以进行编译器和处理器级优化。我们还提供正式和非正式的技术来验证模型是否有效。这些问题从未在任何编程语言得到解决:在为Java解决这个问题的同时,本论文为所有多线程语言提供了一个框架。
本论文描述的工作已经整合到Java 5.0。

第1章

引言

A facility for quotation covers the absence of original thought. – Dorothy L. Sayers, ”《俗丽之夜》”
现代计算机科学的大部分工作都集中在两个目标其中之一。为确保实现它们,我们已投入了大量的精力。不幸的是,在现代编程环境中,这两个目标以惊人的方式相互冲突。
首先,我们希望程序能快速运行。在高层, 这涉及数据结构和算法的设计。在低层,这涉及投入大量时间和精力重新排序代码,以确保代码以最有效的方式运行。
对于现代编译器和处理器,这个低层次至关重要。推断执行和指令重排序是不可或缺的两个工具,在过去几十年中,计算机算力爆炸增长。大多数编译器优化,包括指令调度,寄存器分配,公共子表达式消除和冗余读取消除,可以被认为在某种程度上依赖于指令重排序。例如,当冗余读取删除时,编译器实际上是将冗余读取移动第一次读取的位置。同样,处理器优化(例如使用写缓冲区和无序完成/问题)也反映了重排序。
第二个目标是确保程序员和计算机都能理解我们告诉他们要做的事情。程序员假设了许多代码的执行方式。有时这些假设是正确的,有时它们是错误的。而在后台,在比编程工作更低的层次,在编译器和架构上花费了大量时间来创建一个代码的优化环境,它是运行系统最佳方式。我们对代码执行方式的假设很容易被驳倒。
相比之下,处理器处理单线程指令是非常容易的。只需要确保在早期执行指令时,该指令不会影响任何过去执行的指令。程序员在编写单线程程序时,通常不需要考虑可能的重排序。这个模型实际上允许各种各样的程序优化手段。
当有不止一条线程执行指令时,困难就出现了。处理器可以确保每个线程中的操作在隔离状态下以正确的顺序执行。然而,如果正在执行多个线程,那么我们因为代码优化,为单线程执行强加的限制因素,开始导致一些奇怪的副作用。

Comments
Write a Comment