这是与此相关的问题:java:在一个变量上使用 易失性 VS 每个变量
我有一个或多个不同的对象。我想改变其中的某些状态,然后我想让该状态对其他线程可见。
出于性能原因,我不想使该对象中的每个成员变量都是易失性的。
有时我想在单线程应用程序中使用这些对象。所以在这种情况下,挥发性也会很糟糕。
所以我有以下内容:
//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没有优化掉吗? (在我的其他问题中未得到解答)
每个易失性写入/读取都会刷新所有内存状态?其他(也是非易失性)变量?
现在真正的新问题是:
这是一个好的设计吗?
因为我没有在任何地方看到这样的代码,所以我发布在这里。
我应该以其他方式对我的 Progamm 进行编程吗?
是否还有其他最佳实践来提高性能并获得可见性?
在程序设计视图中是否还有其他最佳实践,而不是做这样的事情?
Edit:
我改变的状态是无关的。
所以我想要一个内存变量一个内存刷新器,并且没有锁定机制。它应该将大量的单个易失性变量替换为一个。在某个地方,我不需要显式的易失性内存刷新,因为我使用同步,例如
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?)
...
}
这就是一个例子,它在哪里有用?
概括:
但这是否正确,我认为使用内存刷新的方式?