我需要在 Java 中操作多个属性,同时保持它们同步。
这段代码正确吗(根据我的理解,这是):
class X {
private final Object lockObject = new Object();
private int a;
private boolean b;
private Y y;
public void doStuff(int i) {
synchronized (lockObject) {
a = i;
b = a == 8;
y.someMethod(b);
y = new Y(a, y);
}
}
}
这个
synchronized
块是否确保更新所有属性或仅写入锁定的属性(在这种情况下,锁定没有状态的最终对象实际上没有意义)?
或者我是否需要使用
volatile
来确保所有线程上的内存可见性更新:
class X {
private final Object lockObject = new Object();
private volatile int a;
private volatile boolean b;
private volatile Y y;
public void doStuff(int i) {
synchronized (lockObject) {
a = i;
b = a == 8;
y.someMethod(b);
y = new Y(a, y);
}
}
}
我实际上 99% 确定第一个是正确的,但不是 100%,感谢您的回答。
第一个。
但是,仅在也锁定此锁对象的其他线程之间的交互中。换句话说,如果 10 个线程同时调用
doStuff
:
a == 8
检查将看到自己的 a = i
,保证作为 a
的状态。无需也声明这些字段
volatile
。