假设我们有一个对象,其方法/字段在“this”上同步。这个问题实际上是关于“这个”的,因为我认为“这个”参考意味着什么很难。
所以我们的对象是:
class A {
private Field a;
private Field b;
public synchronized void doSomething() {
//something with a
}
public synchronized void somethingElse() {
//do something as with b
}
}
然后我们有另一个对象或方法,它接受 A 对象并通过 doSomething 和 somethingElse 方法在 a 和 b 上工作。所以我需要在处理 A 对象时保持状态一致,因此我同步。假设那些 A 对象是 Map 的值。然后我会迭代价值观并做我所做的事情。所以问题是,以下列方式执行它是否是线程安全的:
for(A aObject : map.values()) {
synchronized(aObject) {
aObject.doSomething();
aObject.somethingElse();
}
}
如果“this”引用与 aObject 引用相同,我想我不应该遇到麻烦。但是,如果我这样做怎么办:
for(A aObject : map.values()) {
A anotherReference = aObject;
synchronized(anotherReference) {
anotherReference.doSomething();
anotherReference.somethingElse();
}
}
它仍然是线程安全的吗?我的意思是我可以在锁定引用的本地副本上同步吗?
注意:这是对我需要在代码中执行的操作的过度简化。