gpt4 book ai didi

java - Java中的StoreStore内存屏障是否禁止读写重新排序?

转载 作者:行者123 更新时间:2023-12-02 09:28:12 30 4
gpt4 key购买 nike

现在我们有了

Load A
StoreStore
Store B

是否有可能实际执行顺序如下

StoreStore
Store B
Load A

如果可能,如何解释似乎违反Java volatile 发生前保证的情况。

据我所知, volatile 语义是使用以下JMM内存屏障添加策略实现的

insert a StoreStore before volatile variable write operation
insert a StoreLoad after volatile variable write operation
insert a LoadLoad after volatile variable read operation
insert a LoadStore after volatile variable read operation

现在,如果我们有两个 java 线程,如下所示

线程 1

Load A
StoreStore
Store volatile B

线程 2

Load volatile B
Load C

根据《Java volatile 发生前保证》,当加载 volatile B 之后时,加载 A 应该发生在 加载 C 之前存储 volatile B,但是如果加载A可以重新排序到“存储 volatile B之后”,如何保证加载A在加载C之前

最佳答案

从技术上讲,Java 语言不存在内存障碍。相反,Java 内存模型是根据发生在关系来指定的;有关详细信息,请参阅以下内容:

您所讨论的术语来自The JSR-133 Cookbook for Compiler Writers 。正如该文档所说,它是为编写实现 Java 内存模型的编译器的人们提供的指南。它正在解释 JMM 的含义,显然无意成为官方规范。 JLS 是规范。

JSR-133 Cookbook 中有关内存屏障的部分根据它们限制特定加载和存储序列的方式对它们进行分类。对于 StoreStore 障碍,它说:

The sequence: Store1; StoreStore; Store2 ensures that Store1's data are visible to other processors (i.e., flushed to memory) before the data associated with Store2 and all subsequent store instructions. In general, StoreStore barriers are needed on processors that do not otherwise guarantee strict ordering of flushes from write buffers and/or caches to other processors or main memory.

如您所见,StoreStore 屏障仅约束​​store 操作的行为。

在您的示例中,您有一个加载,后跟一个存储StoreStore 屏障的语义没有提及 load 操作。因此,您建议的重新排序是允许的。

关于java - Java中的StoreStore内存屏障是否禁止读写重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58185339/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com