只是想知道(尽可能详细地),为什么在将对象用作锁时修改对象是一种不好的做法。
//Assuming the lockObject is globally available
synchronized(lockObject){
lockObject.someMutativeOperation(...);
}
干杯
只是想知道(尽可能详细地),为什么在将对象用作锁时修改对象是一种不好的做法。
//Assuming the lockObject is globally available
synchronized(lockObject){
lockObject.someMutativeOperation(...);
}
干杯
我不知道我是否听说过这种说法。当然,重新分配会很糟糕lockObject
(因为那样你会在别处锁定不同的对象),但我认为改变它没有任何问题。
synchronized
此外,拥有一个改变对象的方法是相当普遍的:
public synchronized void setSomething(int something) {
this.something = something;
}
在这种情况下,对象本身被用作锁。在单独的对象上同步有什么意义?
这不是坏习惯,这是好习惯。你从哪里听到的?
如果您使用原始同步,则在修改对象(或另一个锁)之前对其进行同步。
不过,这取决于对象的范围。如果对象的范围在您的类之外,您应该使用不同的同步机制
我猜你听说的是改变参考:
synchronized (thing) {
...
thing = newThing;
...
}
这通常表示错误。它可能应该使用不会更改的引用锁定。我认为是Bitter Java在读写锁中出现了这种性质的错误(Java库中的读写锁已经有五年了,因此不再需要具体实现)。