Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JVM/JIT插入Fence指令_Java_Memory Model_Java Memory Model - Fatal编程技术网

Java 通过JVM/JIT插入Fence指令

Java 通过JVM/JIT插入Fence指令,java,memory-model,java-memory-model,Java,Memory Model,Java Memory Model,Java内存模型提供了DRF保证(数据竞争自由),这意味着在Java的宽松内存模型下执行的无数据竞争程序将提供与顺序一致执行相同的行为。我有以下问题: a) 给定一个racy程序,编译器(非常具体地说是任何jvm实现)是否会进行延迟集分析/线程转义分析等,以找出需要插入的围栏指令,从而使其无竞争?或者JIT是基于它在哪里执行的 b) 若编译器这样做(在本例中为jvm),为什么我们不能只编写racy程序,因为编译器无论如何都会将其转换为无种族限制的程序?若编译器有办法做到这一点(通过插入篱笆使其不

Java内存模型提供了DRF保证(数据竞争自由),这意味着在Java的宽松内存模型下执行的无数据竞争程序将提供与顺序一致执行相同的行为。我有以下问题: a) 给定一个racy程序,编译器(非常具体地说是任何jvm实现)是否会进行延迟集分析/线程转义分析等,以找出需要插入的围栏指令,从而使其无竞争?或者JIT是基于它在哪里执行的

b) 若编译器这样做(在本例中为jvm),为什么我们不能只编写racy程序,因为编译器无论如何都会将其转换为无种族限制的程序?若编译器有办法做到这一点(通过插入篱笆使其不受限制),那个么如何(有意地)编写快速程序,比如java中并发数据结构的一些实现

c) 第三种可能是jvm本身并没有将racy转换为无种族歧视的程序,但还有其他的分析可以为我们做到这一点。是这样吗

给定一个racy程序,编译器(非常具体地说是任何jvm实现)是否会进行延迟集分析/线程转义分析等,以找出需要插入的围栏指令,从而使其无竞争?或者JIT是基于它在哪里执行的

内存围栏指令特定于体系结构的指令集。它们在JVM的指令集中没有等价的指令。因此,实际上是JVM/JIT向处理器发出围栏指令

若编译器这样做(在本例中为jvm),为什么我们不能只编写racy程序,因为编译器无论如何都会将其转换为无种族限制的程序?若编译器有办法做到这一点(通过插入篱笆使其不受限制),那个么如何(有意地)编写快速程序,比如java中并发数据结构的一些实现

编译器只会确保在生成字节码时,对JVM中的变量执行的所有操作都遵守Java内存模型中指定的规则。具体地说,在优化领域,编译器可以自由地优化任何指令集,只要它不影响动作之间必须存在的发生之前关系,或者动作之间的同步顺序。例如,编译器不会重新组织对易失性变量的读取和写入。它还将确保在进入或离开受保护(同步)的代码区域时,在不违反关系之前发生

因此,编译器将把一个“racy”程序转换成一个无种族的程序的说法是不正确的。事实上,一个假定为无竞争(但不是在Java内存模型下)的程序在优化后可能会变成一个“快速”程序

Java中数据结构的并发实现依赖于Java内存模型提供的保证。具体地说,这是Java5中修订的Java内存模型,在该模型中,volatile变量的读写之间的“发生之前”关系被精确指定。
java.util.concurrent
包中的ConcurrentXXX类严重依赖于这种承诺的易失性读取行为,以确保无竞争行为。在Java内存模型下,如果程序顺序是这样的,则保证在读取之前先写入易失性变量;简单地说,volatile read将始终检索变量中最准确的数据版本。并发类利用这一点来确保数据结构可以由单个线程更新,同时由多个其他线程读取(在任何其他场景中,都会存在争用条件)

第三种可能是jvm本身并没有将racy转换为无种族歧视的程序,但还有其他的分析可以为我们做到这一点。是这样吗

JVM发出内存围栏指令。它不执行任何“racy”程序到“race free”程序的转换。如果编译器生成的字节码遵循Java内存模型,那么JVM/JIT将在必要时发出内存限制指令——读取/写入易失性变量、获取或释放对象上的监视器等

冒着重复我自己的风险,JVM和编译器都不会将“racy”程序转换为无种族竞争的程序,反之亦然。任何与此相反的行为都是Java内存模型或JVM中的错误。您将需要通过理解程序顺序、同步顺序和发生之前顺序,以无竞争的方式编写程序,并且编译器和JVM将保证在运行时确保它

我鼓励您阅读,以获得关于JVM如何发布内存围栏指令和保证Java内存模型所做承诺的更多细节