gpt4 book ai didi

java - 1 java内存刷新 volatile : A good programdesign?

转载 作者:行者123 更新时间:2023-12-02 08:51:31 27 4
gpt4 key购买 nike

这是一个与此相关的问题:java: using volatile at one variable VS each variable

我有一个或多个不同的对象。我想更改其中的某些状态,然后我想让该状态对其他线程可见。

出于性能原因,我不想使该对象中的每个成员变量都是 volatile 的。有时我想在单线程应用程序中使用这些对象。所以在这种情况下, volatile 也会很糟糕。

所以我有以下内容:

//these following mehtods change some internal variable state. These variables are not volatile or synchronized

boolean volatile memoryFlusher=false;

Thread1:

obj1->changeSomeState();
obj1->changeMoreState();
obj2->alsoSomeStateChange();

//and now i want to make that state visible to others

memoryFlusher=false; //volatile write


Thread2:

boolean tmp=memoryFlusher; // volatile read but variable is not used again

obj1->getState();
obj2->getState();

所以到目前为止,它或多或少与我在开始时链接的相关问题相同。

所以现在我想问以下问题:

我的内存Flusher没有优化掉? (在我的其他问题中未得到解答)每个 volatile 写入/读取都会刷新所有内存状态?其他(也是非 volatile )变量?

现在真正的新问题:

这是一个很好的设计吗?因为我没有在任何地方看到任何这样的代码,所以我发布在这里。

我应该以其他方式对我的 Progamm 进行编程吗?是否还有其他最佳实践来提高性能并获得可见性?在程序设计 View 中是否还有其他最佳实践,而不是这样做?

编辑:

我改变的状态是不相关的。所以我想要一个内存变量的内存刷新器,并且没有锁定机制。它应该将大量的单个 volatile 变量替换为一个。在某个地方,我不需要显式的 volatile 内存刷新,因为我使用同步,例如

synchronized(x)
{
...
obj1->stateChange() //if internally is used a volatile, then i have a volatile memory flush and later the synchronized-end memory-flush, i guess (is that right?)
...
}

这就是一个例子,它在哪里有用?!

总结:但这是否正确,我认为使用该内存刷新的方式?

最佳答案

您的 volatile 读取和写入未经过优化,但我认为此代码没有任何用处。这可能就是为什么你在其他地方看不到它的原因。不过,您没有说出您的期望,所以谁知道呢?

看起来您想要确保 Thread2 可靠地读取 Thread1 所做的状态更改。嗯,只有当您确定 Thread2 中的代码实际上在 Thread1 中的代码之后运行时,这才有效。

你怎么知道是这样的?

我建议,如果确实有任何方法可以确保 Thread2 代码发生在 Thread1 代码之后,那么就已经存在内存屏障了证实了这一事实,并使您的 volatile 变量变得不必要。

关于java - 1 java内存刷新 volatile : A good programdesign?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59376433/

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