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的值
,对吗?