gpt4 book ai didi

Java:没有 volatile 变量就关闭?

转载 作者:行者123 更新时间:2023-12-02 01:11:06 24 4
gpt4 key购买 nike

以下场景:

我有一个应用程序,它运行了数周,然后我想优雅地关闭它。

下面的代码可以解决这个问题:

Main-Thread:

boolean volatile active=true;

while(active)
{
//loop-code (very fast)
}


//shutdown-thread, called once after a few weeks

active=false;

现在,在每次循环迭代之后,我都会在主内存中进行查找,这是导致 volatile 读取的原因(对吗?!)。

我不希望这样,只是为了几周后的关闭。

还有其他解决方案可以让我的主线程收到有关关闭的通知吗?

有直接进入主线程缓存的信号吗?这样它就不必每次都在主内存中查找自己,而是从 extern 收到通知?

或者还有其他解决方案吗?

编辑(将我自己的答案整合到这个问题中):

一个可能的解决方案是减少 volatile 访问,请参阅以下代码:

boolean volatile active=true;


while(active)
{
for(int i=0; i<100; ++i)
{
//loop-code
}
}

因此,通过该解决方案,我可以减少 volatile 读取,但在关闭后,我会增加最大循环迭代次数,从 1 增加到 100。

该解决方案减少了 volatile 访问,但并未完全消除它。

最佳答案

您关于 volatile 读取总是命中主内存的假设对于缓存一致性系统并不成立。 volatile 读取应该命中 L1,直到另一个线程修改标志并使变量所在的缓存行无效。

但是, volatile 读取与后续访问建立了发生前关系,因此这会阻止编译器和 CPU 执行某些延迟隐藏技巧。相反,使用不透明访问模式来减轻影响(感谢 Holger :))。

这样的事情应该很快,尽管我将把基准测试留给你:

AtomicBoolean active = new AtomicBoolean(true);

while(active.getOpaque())
{
//loop-code (very fast)
}


//shutdown-thread, called once after a few weeks

active.setOpaque(false);

如果您想知道所有这些访问模式是什么,这里有一个很好的摘要:Using JDK 9 Memory Order Modes .

关于Java:没有 volatile 变量就关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59380261/

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