【发布时间】:2019-12-17 14:32:08
【问题描述】:
这是一个与此相关的问题:java: using volatile at one variable VS each variable
我有一个或多个不同的对象。我想更改其中的某些状态,然后我想让该状态对其他线程可见。
出于性能原因,我不想使该对象中的每个成员变量都可变。 有时我想在单线程应用程序中使用这些对象。所以在那种情况下,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();
所以到目前为止,它与我在开头链接的相关问题或多或少相同。
所以现在我想问以下问题:
我的 memoryFlusher 没有被优化掉? (在我的另一个问题中没有回答) 每次 volatile 写入/读取都会刷新 ALL 的所有 memoryState?其他(也是非易失性)变量?
现在是真正的新问题:
这是一个好的设计吗? 因为我没有在任何地方看到任何这样的代码,所以我在这里发布。
我应该以其他方式对我的 Progamm 进行编程吗? 是否有其他最佳实践来提高性能并获得可见性? 在程序设计视图中是否有其他最佳实践,没有做这样的事情?
编辑:
我改变的状态是无关的。 所以我想要那个内存变量一个memoryflusher,并且没有锁定机制。它应该将许多单个 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?)
...
}
这只是一个例子,它在哪里有用?!
总结: 但这是正确的吗,我认为以这种方式使用 memoryFlushing?
【问题讨论】:
标签: java multithreading design-patterns concurrency volatile