尽管我没有找到这个问题,但这似乎是一个很常见的问题。假设我有这段代码:
public class MyClass {
private AnotherClass mField;
public void changeOne(AnotherClass newOne) {
// <...> lines of code here
synchronized (mField) {
mField = newOne;
}
// <...> lines of code here
}
public void changeTwo(AnotherClass newTwo) {
// <...> lines of code here
mField = newTwo;
// <...> lines of code here
}
}
假设
changeOne()
和changeTwo()
是从不同的线程调用的。在changeOne()
中具有一个同步块足以保护mField
不受changeTwo()
的更改是否足够?还是我需要将mField
更改为synchronized
块的每个位置显式包装? (请留下同步方法和其他方法)。 最佳答案
您需要使用同步块(或)同步方法来显式同步对mField
的所有修改。否则,一个以上的线程可以通过一次执行changeTwo来更改mField
。
编辑:正如特德·霍普(Tedd Hopp)所建议的,如果变量不是非易失性读取,还需要同步并锁定,则您得到的应该是同一对象。