Java 内存模型操作

Java Memory Model Actions

我正在尝试理解 Java Memory Model,但我在 操作 方面遇到了一些麻烦。我理解一个动作的定义是<t,k,v,u>,但是我不太明白一个程序是如何分解成动作的,这些动作是多么的抽象。

我的第一个假设是操作是原子的。 var1 = var2 将被分成两个动作 - 读取 var2 和写入 var1,但是一个例子 here 表明 var1 = var2 本身就是一个动作。所以每个action都对应源码中的一条语句

这如何与 if 语句一起使用?例如,如果我们有 if(r1 == r2 && r3 == r4) { ... },整个语句是一个动作,还是分成多个动作(如果是这样,相应的动作如何保持 'connected' 作为 if 语句)?

动作在JLS 17.4.2中定义,特别关注"inter-thread actions:"

An inter-thread action is an action performed by one thread that can be detected or directly influenced by another thread. ... This specification is only concerned with inter-thread actions.

这些操作的完整列表在 link(这里不值得完整复制),但它包括变量的读取和写入。

var1 = var2的问题取决于var1var2是什么。如果它们都是 class 上的字段,那么它们就是两个独立的操作(读取 var2 和写入 var)。如果它们中的任何一个是局部变量,那么它的状态属于方法的栈帧,它本质上是线程局部的,因此不是线程间的动作。

例如,如果 var2 是一个字段而 var1 是一个局部变量,那么唯一的线程间操作是读取 var2 — 写入该值到局部变量是不是线程间动作,因为它只能被局部堆栈帧所属的线程观察到。

同理,if (r1 == r2 && r3 == r4)最多可以有4个动作:四个变量的读取,如果是字段的话。 ==&& 操作的结果是线程本地的,因此不算作线程间操作。