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



mFeaute是一个可变对象。

我想知道setFeature(Feature Feature)中mFeature的变化是否对useFeature(…)中的mFeature可见,使用不同的显式形式的synchronized.

谢谢。

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
}
}
}

上面的代码受到数据竞争的影响,因此被破坏了。因为使用了不同的锁,所以在m特性的写和读之间没有happens before边。读和写需要使用同一个锁实例。

不清楚您要同步的是什么(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);
}
}
}

最新更新