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 的写入和读取之间没有发生边缘。读和写需要使用同一个锁实例
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 的写入和读取之间没有发生边缘。读和写需要使用同一个锁实例