在Java中,`synchronized`等同于`synchronized(this)`?

时间:2015-09-09 08:39:22

标签: java multithreading locking synchronized

我正在查看DatagramSocket的源代码,我发现了这个:

public void disconnect() {
    synchronized (this) {
        if (isClosed())
            return;
        if (connectState == ST_CONNECTED) {
            impl.disconnect ();
        }
        connectedAddress = null;
        connectedPort = -1;
        connectState = ST_NOT_CONNECTED;
    }
}

我对synchronized methods的理解是他们锁定this。那么代码是否等同于以下内容?

public synchronized void disconnect() {
    if (isClosed())
        return;
    if (connectState == ST_CONNECTED) {
        impl.disconnect ();
    }
    connectedAddress = null;
    connectedPort = -1;
    connectState = ST_NOT_CONNECTED;
}

为什么语言设计师选择不在这里使用同步方法?

2 个答案:

答案 0 :(得分:3)

是的,这两个代码片段是等效的。

我们只能猜到为什么编写此代码的人选择了更详细的版本。它可能是某人的个人偏好,也可能是历史人工制品。例如,它之前可能是synchronized(someObject)或者可能只覆盖了方法的一部分,重构该方法的任何人都没有将synchronized部分转换为synchronized方法。

答案 1 :(得分:1)

  

为什么语言设计师选择不在这里使用同步方法?

我不知道他们的思想,但在我看来,第一种方式更好。我真的不喜欢“同步方法”这个短语,因为方法不是我们需要通过同步来保护的。

我们需要保护数据

synchronized块的整个点通常是,为了推进程序的状态,一个线程必须创建一个临时的,无效的状态。通过适当使用synchronized,我们可以防止任何其他线程看到无效状态。这意味着不仅要同步正在改变状态的代码块,还要同步任何其他可以检查状态的代码块。

我认为同步方法的想法来自20世纪70年代发表的描述监视器的论文。 https://en.wikipedia.org/wiki/Monitor_%28synchronization%29监视器基本上是一个对象,其方法是 all atomic。当计算机科学家开始探索和形成关于并行编程的思考的方法时,这是一个有用的抽象;但在许多实际应用中,“监视”的想法过于严格:仅使用监视器最有效地使用多处理器系统。