我正在努力理解Java内存模型,但我在操作方面遇到了一些困难。我理解动作的定义为,但我不太明白程序是如何被分解成动作的,以及这些动作有多抽象。
我的第一个假设是,行动是原子的。var1 = var2将被分解为两个操作--读var2和写var1,但是这里的一个例子表明var1 = var2本身就是一个动作。因此,每个动作都对应于源代码中的一个语句。
对于if语句,这是如何工作的?例如,如果我们有if(r1 == r2 && r3 == r4) { ... },整个语句是一个动作,还是分解成多个动作(如果是,对应的操作如何保持作为if语句的“连接”)?
发布于 2015-09-09 02:13:59
动作是在JLS 17.4.2中定义的,它特别关注“线程间操作:”
线程间操作是由一个线程执行的可以被另一个线程检测或直接影响的动作。..。本规范只涉及线程间操作.
这些操作的完整列表位于链接处(不值得在这里进行完整的复制),但它包括变量的读和写。
var1 = var2的问题取决于var1和var2是什么。如果它们都是类中的字段,那么它们是两个单独的操作(读取var2和写到var)。如果它们中的任何一个是局部变量,那么它的状态属于方法的堆栈框架,它本质上是线程本地的,因此不是线程间的操作。
例如,如果var2是一个字段,而var1是一个局部变量,那么唯一的线程间操作就是读取var2 --将该值写入局部变量并不是线程间操作,因为只能通过本地堆栈帧所属的线程来观察它。
类似地,if (r1 == r2 && r3 == r4)最多可以有4个操作:如果四个变量是字段,则读取它们。==和&&操作的结果是线程本地的,因此不算线程间操作。
https://stackoverflow.com/questions/32469851
复制相似问题