改变锁定对象

时间:2009-09-15 17:51:41

标签: java synchronization locking mutable

只是好奇地知道(尽可能详细),为什么这是一个不好的做法 在将对象用作锁时修改对象。

//Assuming the lockObject is globally available
    synchronized(lockObject){
        lockObject.someMutativeOperation(...);
    }

干杯

3 个答案:

答案 0 :(得分:4)

我不知道我听过那个断言。当然重新分配lockObject(因为那时你会在其他地方锁定另一个对象)会很糟糕,但我没有看到改变它的任何错误。

此外,使用synchronized方法来改变对象是相当普遍的:

public synchronized void setSomething(int something) {
    this.something = something;
}

在这种情况下,对象本身用作锁。同步一个单独的对象有什么意义?

答案 1 :(得分:3)

这不是不好的做法,那是良好的练习。你在哪里听到的?

如果您正在使用原始同步,则在修改对象(或其他锁)之前进行同步。

但这取决于对象的范围。如果对象的范围在您的类之外,则应使用不同的同步机制

答案 2 :(得分:2)

我猜你所听到的是改变了参考文献:

synchronized (thing) {
    ...
    thing = newThing;
    ...
}

这通常表示错误。应该使用不会更改的引用锁定它。我认为Bitter Java在读写锁中存在这种性质的错误(Java库中存在读写锁已有五年了,因此不再需要具体实现。)