- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个与此相关的问题: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/
这是一个与此相关的问题:java: using volatile at one variable VS each variable 我有一个或多个不同的对象。我想更改其中的某些状态,然后我想让该状态对
我是一名优秀的程序员,十分优秀!