Java 中不同锁下可变对象的可见性

Visibility of mutable object under different locks in Java

mFeaute 是一个可变对象。

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

谢谢。

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

    static void setFeature(Feature feature){
        // doSomething
        synchronized (FeatureService.class){
            mFeature = feature;
            // doSomething
        }
        // doSomething
    }

    public void useFeature(...){
        // doSomething
        synchronized (MUTEX){
            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 的写入和读取之间没有发生边缘。读和写需要使用同一个锁实例