没有合适的资源?快使用搜索试试~ 我知道了~
JSR133-Java内存模型与线程规范中译版

JSR133就不用多做介绍了,这是JSR133的中译版,原文链接:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf 更多并发相关的内容,上并发编程网:http://ifeve.com/
资源推荐
资源详情
资源评论










1 / 66
JSR-133:Java
TM
内存模型与线程规范
翻译:ticmy
1 介绍 .......................................................................................................................................................................... 3
1.1 锁 .......................................................................................................................................................................................... 3
1.2 示例中的表示法 .................................................................................................................................................................. 4
2 未正确同步的程序会表现出出人意料的行为 ...................................................................................................... 5
3 非正式语义 .............................................................................................................................................................. 7
3.1 顺序一致性(Sequential Consistency).............................................................................................................................. 9
3.2 final 字段 ............................................................................................................................................................................. 10
4 什么是内存模型 .................................................................................................................................................... 13
5 定义 ........................................................................................................................................................................ 14
6 Java 内存模型的近似模型 ..................................................................................................................................... 18
6.1 顺序一致的内存模型 ......................................................................................................................................................... 18
6.2 Happens-Before 内存模型 .................................................................................................................................................. 19
6.3 因果关系 ............................................................................................................................................................................ 20
7 Java 内存模型的正式规范 ..................................................................................................................................... 24
7.1 动作与执行过程(Actions and Executions) ................................................................................................................... 24
7.2 定义 .................................................................................................................................................................................... 26
7.3 良构的( Well-Formed)执行过程 ................................................................................................................................. 27
7.4 执行过程的因果(Causality)要求 .................................................................................................................................. 28
7.5 可观察的行为与不会终止的执行过程 ............................................................................................................................. 30
8 经典测试用例与行为 ............................................................................................................................................ 33
8.1 内存模型允许的怪异行为 ................................................................................................................................................. 34
8.2 内存模型禁止的行为 ......................................................................................................................................................... 37
9 final 字段的语义 ..................................................................................................................................................... 39
9.1 final 字段语义的目标与要求 ............................................................................................................................................. 39
9.2 final 字段的正式语义 ......................................................................................................................................................... 42
9.3 用于 final 字段的 JVM 规则 ............................................................................................................................................. 45
10 典型测试用例与 final 字段的行为 ..................................................................................................................... 46
11 字分裂(Word Tearing) ......................................................................................................................................... 51
12 double 和 long 的非原子性处理 .......................................................................................................................... 52
13 公平性 .................................................................................................................................................................. 52
14 wait 集与通知(Notification) ............................................................................................................................ 54
14.1 等待(Wait) ................................................................................................................................................................... 54
14.2 通知(Notification) ....................................................................................................................................................... 57
14.3 中断(Interruptions) ...................................................................................................................................................... 57
14.4 等待(Waits),通知( Notification)以及中断(Interruption)间的相互影响 ...................................................... 58
15 Sleep 与 Yield ..................................................................................................................................................... 59
16 终结操作(Finalization) ................................................................................................................................... 60
16.1 终结操作的实现 .............................................................................................................................................................. 61
16.2 与内存模型的交互........................................................................................................................................................... 64

2 / 66
本文是 JSR-133 规范,即 Java
TM
内存模型与线程规范
,由 JSR-133 专家组开发。
本规范是 JSR-176(定义了 Java
TM
平台 Tiger(5.0)发布版的主要特性)的一部
分。本规范的标准内容将合并到 Java
TM
语言规范
、Java
TM
虚拟机规范
以及 java.lang
包的类说明中。本 JSR-133 规范将不再通过 JCP 维护和修改。未来所有对这些标准
化内容的更新、修正以及说明都会出现在上述这些文档中。
本规范的标准化内容包含在第 5, 7, 9.2, 9.3, 11, 12, 14, 15 以及 16 节。其它章节,以
及上述提到的章节的部分内容,属非标准化内容,用于解释和说明标准化内容。如
果标准化内容和非标准化内容有冲突,以标准化内容为准。
本规范的讨论与开发异常复杂且专业性强,需要对一些学术论题有深刻的见解并了
解它们的发展过程。这些讨论在 JMM web 站点上都有存档。该站点提供了额外的
信息,可以帮助理解本规范形成的过程;站点是:
http://www.cs.umd.edu/~pugh/java/memoryModel
上述 web 站点以及邮件列表将持续更新和维护,非标准化内容,有助于人们理解
JSR-133 规范,未来若有更新和扩展,将可以从该站点上找到。
在对 JLS 原始规范的改变中,有两处最有可能要求 JVM 实现也做出相应的变动:
加强了 volatile 变量的语义,需要有 acquire 和 release 语义。在原始的规范
中,volatile 变量的访问和非 volatile 变量的访问之间可以自由地重排序。
加强了 final 字段的语义,无需显式地同步,不可变对象也是线程安全的。
这可能需要在给 final 字段赋值的那些构造器的末尾加上 store-store 屏障。

3 / 66
1 介绍
Java
TM
虚拟机支持多线程执行。线程是用 Thread 类来表示的。用户创建一个线程
的唯一方式是创建一个该类的对象;每个线程都与这样一个对象相关联。在对应的
Thread 对象上调用 start()方法将启动线程。
线程的行为,尤其是未正确同步时的行为,可能会让人困惑和违背直觉。本规范描
述了用 Java
TM
语言编写的多线程程序的语义;包括多线程更新共享内存时,读操
作能看到什么值的规则。因为本规范与不同的硬件架构的内存模型相似,所以,这
里的语义都指的是 Java
TM
内存模型。
这些语义不会去描述多线程程序该如何执行。而是描述多线程程序允许表现出的行
为。任何执行策略,只要产生的是允许的行为,那它就是一个可接受的执行策略。
1.1 锁
有多种机制可以用于线程间通信。其中最基础的是
同步
,同步是用管程来实现的。
每个对象都关联着一个管程,线程可以通过它来执行
锁定(
lock
)
或
解锁
(
unlock
)
操作。每次仅有一个线程可以持有管程上的锁。其它试图锁定该管程的
线程会一直阻塞,直到能从该管程上获得锁为止。
线程 t 可以锁定一个管程多次,每个 unlock 操作都会将一次 lock 操作撤销。
synchronized 语句需要一个对象的引用;随后会尝试在该对象的管程上执行 lock 动
作,如果 lock 动作未能成功完成,将一直等待。当 lock 动作执行成功,就会运行

4 / 66
synchronized 语句块中的代码。一旦语句块中的代码执行结束,不管是正常还是异
常结束,都会在之前执行 lock 动作的那个管程上自动执行一个 unlock 动作。
synchronized 方法在调用时会自动执行一个 lock 动作。在 lock 动作成功完成之前,
都不会执行方法体。如果是实例方法,锁的是调用该方法的实例(即,方法体执行
期间的 this)相关联的管程。如果是静态方法,锁的是定义该方法的类所对应的
Class 对象。一旦方法体执行结束,不管是正常还是异常结束,都会在之前执行
lock 动作的那个管程上自动执行一个 unlock 动作。
语义既不阻止也不要求对死锁条件进行检测。程序中若线程会(直接地或间接地)
锁定多个对象,应当采取一些手段来避免死锁,若有必要,创建一些更高级别的不
会死锁的锁原语。
其它诸如读写 volatile 变量,以及 java.util.concurrent 包中的类,都为同步提供了可
选的机制。
1.2 示例中的表示法
Java 内存模型并没有完全地基于 Java 语言的面向对象特性。为了保持示例简洁明
了,通常会展示一些没有 类或方法定义或显式解引用的代码片段。大部分例子都
包含两或多个线程访问局部变量、共享全局变量或对象的实例字段。通常使用变量
名 r1 或 r2 来表示方法或线程的局部变量,这些变量不会被其它线程访问。

5 / 66
2 未正确同步的程序会表现出出人意料的行为
Java 的语义允许编译器和微处理器进行优化,这会影响到未正确同步的代码,可能
会使它们的行为看起来自相矛盾。
图 1:语句重排序导致的出人意料的结果
考虑图 1 中的例子。程序中用到了局部变量 r1 和 r2,以及共享变量 A 和 B。可能
会出现 r2 == 2、r1 == 1 这样的结果。直觉上,应当要么指令 1 先执行要么指令 3
先执行。如果指令 1 先执行,它不应该能看到指令 4 中写入的值。如果指令 3 先执
行,它不应该能看到指令 2 写的值。
如果某次执行表现出了这样的行为,那么我们可能得出这样的结论,指令 4 要在指
令 1 之前执行,指令 1 要在指令 2 之前执行,指令 2 要在指令 3 之前执行,指令 3
要在指令 4 之前执行。如此,从表面看来,有悖常理。
然而,从单个线程的角度看,只要重排序不会影响到该线程的执行结果,编译器就
可以对该线程中的指令进行重排序。如果指令 1 与指令 2 重排序,那就很容易看出
为什么会出现 r2 == 2 和 r1 == 1 这样的结果了。
一些编程人员可能认为程序表现出这种行为是不对的。但是,需要注意的是,这段
代码没有被充分同步:
剩余65页未读,继续阅读
资源评论

- dsy_522016-10-08找来学习一下
- ed350072016-09-01比较不错的,谢谢啦谢谢
- 達魔2015-05-07最近正在研究内存模型,找来学习一下
龙四
- 粉丝: 739
- 资源: 19

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
