1

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

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

干杯

4

3 回答 3

4

我不知道我是否听说过这种说法。当然,重新分配会很糟糕lockObject(因为那样你会在别处锁定不同的对象),但我认为改变它没有任何问题。

synchronized此外,拥有一个改变对象的方法是相当普遍的:

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

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

于 2009-09-15T17:58:39.827 回答
3

这不是坏习惯,这是习惯。你从哪里听到的?

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

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

于 2009-09-15T17:57:27.007 回答
2

我猜你听说的是改变参考:

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

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

于 2009-09-15T18:15:50.747 回答