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
的问题取决于var1
和var2
是什么。如果它们都是 class 上的字段,那么它们就是两个独立的操作(读取 var2
和写入 var
)。如果它们中的任何一个是局部变量,那么它的状态属于方法的栈帧,它本质上是线程局部的,因此不是线程间的动作。
例如,如果 var2
是一个字段而 var1
是一个局部变量,那么唯一的线程间操作是读取 var2
— 写入该值到局部变量是不是线程间动作,因为它只能被局部堆栈帧所属的线程观察到。
同理,if (r1 == r2 && r3 == r4)
最多可以有4个动作:四个变量的读取,如果是字段的话。 ==
和 &&
操作的结果是线程本地的,因此不算作线程间操作。
我正在尝试理解 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
的问题取决于var1
和var2
是什么。如果它们都是 class 上的字段,那么它们就是两个独立的操作(读取 var2
和写入 var
)。如果它们中的任何一个是局部变量,那么它的状态属于方法的栈帧,它本质上是线程局部的,因此不是线程间的动作。
例如,如果 var2
是一个字段而 var1
是一个局部变量,那么唯一的线程间操作是读取 var2
— 写入该值到局部变量是不是线程间动作,因为它只能被局部堆栈帧所属的线程观察到。
同理,if (r1 == r2 && r3 == r4)
最多可以有4个动作:四个变量的读取,如果是字段的话。 ==
和 &&
操作的结果是线程本地的,因此不算作线程间操作。