系统相关
首页 > 系统相关> > Java内存模型操作

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