拥有锁定的专用对象是否有用?

时间:2018-05-02 15:32:02

标签: java synchronized

我正在清理遗留的java代码,我发现了以下构造:

final class QuiteComplexClass {
    private Object lock = new Object();

    void aMethod() {
        ...
        synchronized(lock) {
              ....
        }
    }
}

这里需要锁定的特殊对象吗?使用简单synchronized (this)时有什么区别?

我认为当类可公开显示并且有人可能错误地在类实例上调用synchronized时,它可能会有用。但是这个类是私有的,所以没有外部代码可以做到这一点。

3 个答案:

答案 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)

不,这是不必要的。使用锁定对象是一种旨在避免锁定实例的模式。这是否有价值往往是一个意见问题。