我正在清理遗留的java代码,我发现了以下构造:
final class QuiteComplexClass {
private Object lock = new Object();
void aMethod() {
...
synchronized(lock) {
....
}
}
}
这里需要锁定的特殊对象吗?使用简单synchronized (this)
时有什么区别?
我认为当类可公开显示并且有人可能错误地在类实例上调用synchronized
时,它可能会有用。但是这个类是私有的,所以没有外部代码可以做到这一点。
答案 0 :(得分:2)
不同之处在于,如果您使用this
作为锁定或标记方法synchronized
,那么另一段代码可能会意外(或有意)将您的QuiteComplexClass
对象用作锁定。它可能会导致您的代码无法正常工作。如果某个其他开发人员决定编写如下代码,那么在保持锁定时,您的代码将无法在synchronized
实例上调用qcc
方法。
synchronized(qcc) { // assuming qcc is an instance of QuiteComplexClass
while (true); // or any other time consuming operation
}
答案 1 :(得分:1)
这里需要锁定的特殊对象吗?使用简单
synchronized (this)
时有什么区别?
简短的回答:不,它没有必要,但除了添加final
之外,我认为删除它几乎没有任何好处。
我倾向于使用锁定对象,因为它们给我一个更细粒度的锁,而不是锁定this
。例如,如果您要保护多个集合不受竞争条件的影响,您的类中可能会有几个不同的锁定对象。有一点可以肯定的是,您应该始终确保锁定字段final
。
private final Object lock = new Object();
这就是说,如果一个类很简单并且你想确保人们知道哪些方法是synchronized
,那么在方法上使用关键字也是非常合适的。正如您所提到的,这是一个内部类,但即便如此,开发外部类的开发人员可能想知道同步点。
答案 2 :(得分:0)
不,这是不必要的。使用锁定对象是一种旨在避免锁定实例的模式。这是否有价值往往是一个意见问题。