一个java memoryFlushing volatile:一个好的程序设计?

问题描述 投票:1回答:1

与其相关的问题:java: using volatile at one variable VS each variable

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

出于性能原因,我不想使该对象中的每个成员变量都是可变的。有时我想在单线程应用程序中使用这些对象。因此,在这种情况下,挥发物也将很不好。

所以我有以下内容:

//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();

所以到目前为止,它与我一开始就链接的相关问题大致相同。

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

我的记忆刷新器没有被优化吗? (我的另一个问题未回答)每次易失性写入/读取均刷新ALL的所有memoryState?其他(也是非易失性的)变量?

现在是真正的新问题:

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

我应该以其他方式编程我的Progamm吗?还有其他最佳实践可以提高性能并提高可视性吗?在程序设计视图中是否还有其他最佳实践,而不必这样做?

java multithreading design-patterns concurrency volatile
1个回答
0
投票

您的易失性读写没有得到优化,但是我看不到此代码有任何用处。这可能就是为什么您在其他地方看不到它的原因。但是,您没有说出对它的期望,所以谁知道呢?

似乎要确保Thread2可靠地读取Thread1所做的状态更改。好吧,仅当您确定Thread2中的代码实际运行Thread1中的代码[[after。您怎么知道是这种情况?

我建议

if

确实可以通过任何方式确保Thread2代码happens after Thread1代码,那么已经存在一个内存屏障,可以建立这一事实并呈现您的volatile变量不必要。
© www.soinside.com 2019 - 2024. All rights reserved.