gpt4 book ai didi

java - 与非 volatile 写入相比, volatile 写入的成本增加

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:32 25 4
gpt4 key购买 nike

我一直在阅读有关 volatile ( https://www.ibm.com/developerworks/java/library/j-jtp06197/ ) 的内容,并发现了一点,即 volatile 写入比非 volatile 写入要昂贵得多。

我可以理解,鉴于 volatile 是一种同步方式, volatile 写入会增加相关成本,但我想知道 volatile 写入究竟是如何比非 volatile 写入昂贵得多;在进行 volatile 写入时,它可能与跨不同线程堆栈的可见性有关吗?

最佳答案

根据您指出的文章,原因如下:

Volatile writes are considerably more expensive than nonvolatile writes because of the memory fencing required to guarantee visibility but still generally cheaper than lock acquisition.

[...] volatile reads are cheap -- nearly as cheap as nonvolatile reads

这当然是真的:内存栅栏操作总是绑定(bind)到写入,无论底层变量是否易变,读取都以相同的方式执行。

但是,Java 中的 volatile 不仅仅是关于 volatile 和非 volatile 内存读取的。事实上,本质上它与这种区别无关:区别在于并发语义

考虑这个臭名昭著的例子:

volatile boolean runningFlag = true;

void run() {
while (runningFlag) { do work; }
}

如果 runningFlag 不是 volatile,JIT 编译器基本上可以将该代码重写为

void run() {
if (runningFlag) while (true) { do work; }
}

不用说,在每次迭代中读取 runningFlag 与根本不读取它所引入的开销之比是巨大的。

关于java - 与非 volatile 写入相比, volatile 写入的成本增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22223922/

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