Java内存模型动作

Java内存模型动作,java,concurrency,memory-model,java-memory-model,Java,Concurrency,Memory Model,Java Memory Model,我试图理解这个问题,但是我在行动上有点困难。我理解动作的定义,但我不太明白程序是如何分解成动作的,这些动作是多么抽象 我的第一个假设是行动是原子的var1=var2将被分为两个动作——读取var2和写入var1,但一个例子表明var1=var2本身就是一个动作。因此,每个操作都对应于源代码中的一条语句 这是如何与if语句一起工作的?例如,如果我们有if(r1==r2&&r3==r4){…},那么整个语句是一个动作,还是分成多个动作(如果是这样,对应的动作如何作为if语句保持“连接”)中定义了动作

我试图理解这个问题,但是我在行动上有点困难。我理解动作的定义,但我不太明白程序是如何分解成动作的,这些动作是多么抽象

我的第一个假设是行动是原子的
var1=var2
将被分为两个动作——读取
var2
和写入
var1
,但一个例子表明
var1=var2
本身就是一个动作。因此,每个操作都对应于源代码中的一条语句

这是如何与if语句一起工作的?例如,如果我们有
if(r1==r2&&r3==r4){…}
,那么整个语句是一个动作,还是分成多个动作(如果是这样,对应的动作如何作为if语句保持“连接”)

中定义了动作,其中特别关注“线程间动作”:

线程间操作是一个线程执行的操作,它可以被另一个线程检测到或直接影响。。。本规范仅涉及线程间操作

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

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

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


类似地,
if(r1==r2&&r3==r4)
最多可以执行4个操作:读取四个变量(如果它们是字段)。
=
&
操作的结果是线程本地的,因此不算作线程间操作。

因此,假设我们有一个语句
r1=x
,其中
x
是共享变量
x
,而
r1
是某个线程的本地变量。根据我链接的第二篇文章,这将作为一个动作提交
r1=x
。但是,只有
x
的读取可以被另一个线程检测到或直接影响,那么为什么
r1
仍然被考虑?您所说的“
r1
仍然被考虑”是什么意思?操作是读取
x
。读取需要将数据从某个地方读取到另一个地方;在本例中,
r1
只是“其他地方”,很可能只是一个寄存器。谢谢你,我想我正在关注。因此,如果该示例中的
r1
也是一个共享变量,
r1=x
将是两个独立的操作-
read x
write r1=x的值
,对吗?