繁体   English   中英

Java中具有不同显式同步形式的可变对象的可见性

[英]Visibility of mutable object with different explicit form of synchronized in Java

mFeaute 是一个可变对象。

我想知道 setFeature(Feature feature) 中 mFeature 的变化是否对 useFeature(...) 中的 mFeature 可见,具有不同的显式同步形式。

谢谢。

public class FeatureService {
    private static Feature mFeature= null; 
    private static final Object MUTEX1 = new Object();
    private static final Object MUTEX2 = new Object();
    ...

    static void setFeature(Feature feature){
        // doSomething
        synchronized (MUTEX1){
            mFeature = feature;
            // doSomething
        }
        // doSomething
    }

    public void useFeature(...){
        // doSomething
        synchronized (MUTEX2){
            someFunction(mFeature);
            // doSomething 
        }
        // doSomething
    }
}
}

目前尚不清楚您要同步的内容(ClassA 和 ObjectB 含糊不清)。 通常,您希望在与给定共享资源交互时在单个互斥锁上进行同步。 创建一个Object作为访问内部mFeature时同步的互斥锁。

public class FeatureService {
  private static Feature mFeature= null; 
  private static final Object MUTEX = new Object();
  ...

  static void setFeature(Feature feature){
    synchronized (MUTEX){
        mFeature = feature;
    }
  }

  public void useFeature(...){
    synchronized (MUTEX){
        someFunction(mFeature);
    }
  }
}

上面的代码受到数据竞争的影响,因此被破坏了。 由于使用了不同的锁,因此在 mfeature 的写入和读取之间的边缘之前不会发生。 您需要使用相同的锁实例进行读取和写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM