Java内存模型操作
作者:互联网
我试图了解Java Memory Model,但我在行动方面遇到了一些麻烦.我理解一个动作的定义为< t,k,v,u>,但我不太明白程序是如何分解为动作的,以及这些动作是如何抽象的.
我的第一个假设是行动是原子的. var1 = var2将分为两个动作 – 读取var2和写入var1,但是示例here表明var1 = var2是一个动作本身.因此,每个操作都对应于源代码中的语句.
这如何与if语句一起使用?例如,如果我们有if(r1 == r2&& r3 == r4){…},整个语句是一个动作,还是分成多个动作(如果是,那么相应的动作如何保持’连接’作为if语句)?
解决方法:
操作在JLS 17.4.2中定义,特别关注“线程间操作:”
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.
这些操作的完整列表位于链接上(并不值得在此完全复制),但它包括对变量的读写.
var1 = var2的问题取决于var1和var2是什么.如果它们都是类中的两个字段,那么这些是两个单独的操作(读取var2并写入var).如果它们中的任何一个是局部变量,那么它的状态属于方法的堆栈帧,它本身就是线程局部的,因此不是线程间的动作.
例如,如果var2是一个字段而var1是一个局部变量,那么唯一的线程间操作就是读取var2 – 将该值写入局部变量不是一个线程间操作,因为它只能是由线程观察到本地堆栈帧属于.
类似地,如果(r1 == r2&& r3 == r4)最多可以有4个动作:四个变量的读取(如果它们是字段). ==和&&的结果操作是线程本地的,因此不算作线程间操作.
标签:java,memory-model,concurrency,java-memory-model 来源: https://codeday.me/bug/20190628/1315187.html