非易失性写

时间:2017-11-17 09:40:36

标签: java concurrency shared-memory volatile memory-fences

我们说我有一个影响班级行为的静态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 最终可见的更新吗?

1 个答案:

答案 0 :(得分:0)

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

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