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