【发布时间】:2015-04-03 08:06:22
【问题描述】:
有多个线程访问一个对象。为了避免内存一致性错误,我对该对象使用了同步方法。
这是否意味着当我在该对象上同步时,只有对象的字段被同步(而不是对象的字段的字段)?
例如:
public class Class1 {
private Object value1;
public Object getValue1() {
return this.value1;
}
public void setValue1(Object value1) {
this.value1 = value1;
}
}
哪个代码是正确的(Class2 或 Class3),为什么?
public class Class2 {
private final Class1 object1 = new Class1();
private Object value2;
public synchronized void setValues(Object value1, Object value2) {
object1.setValue1(value1);
this.value2 = value2;
}
public synchronized Object[] getValues() {
return new Object[] { object1.getValue1(), this.value2};
}
}
public class Class3 {
private final Class1 object1 = new Class1();
private Object value2;
public synchronized void setValues(Object value1, Object value2) {
synchronized (object1) {
object1.setValue1(value1);
}
this.value2 = value2;
}
public synchronized Object[] getValues() {
Object value1;
synchronized (object1) {
value1 = object1.getValue1();
}
return new Object[] { value1, this.value2};
}
}
更具体:
Class2 obj = new Class2();
// thread 1
obj.setValues(..., ...);
// thread 2
Object[] values = obj.getValues();
由于setValues 和getValues 都是同步的,所以this.value2 = value2; 和return new Object[] {..., this.value2}; 在Class2 中将存在happens-before 关系。
但是object1 呢?不能保证this.value1 = value1; 在Class1 中发生在return this.value1; 之前。不是吗?
【问题讨论】:
标签: java multithreading synchronization synchronized