2

假设我有一个int影响类行为的静态。

class A{
    public static int classFlag = 0;
    private int myFlag = 0;

    public void doSomething(){
        if(myFlag != classFlag){
             myFlag = classFlag:
        }

        /*myFlag-dependent behaviour*/
    }
}

系统中只有一个线程发生了变化classFlag,并且/*myFlag-dependent behaviour*/不需要classFlag所有线程立即看到更新。

因此,我想保留classFlag非易失性以避免引入昂贵且完全不必要的内存屏障。

我可以依靠更新来classFlag最终可见吗?

4

1 回答 1

0

基于 myFlag 执行一段代码的读取器线程将无法看到您的更新,这可能导致 1) 非常不确定的行为 2) 错过更新(您永远不知道何时会再次调用此 ::doSomething)

我认为 volatile 的成本足够低,可以保证它的正确使用,而不是让代码留下这样的错误。

于 2017-12-11T15:05:31.087 回答