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

In Java, is `synchronized` equivalent to `synchronized (this)`?

我正在查看 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;
}

语言设计者在这里选择不使用同步方法有什么原因吗?

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

我们只能猜测为什么编写这段代码的人会选择更冗长的版本。这可能是某人的个人喜好,也可能是历史文物。例如,它可能以前是 synchronized(someObject) 或者可能只覆盖了方法的一部分,并且重构该方法的人没有将 synchronized 部分转换为 synchronized 方法。

Is there a reason why the language designers chose not to use a synchronized method here?

我不知道他们的想法,但在我看来,第一种方式更好。我真的很不喜欢这个短语"synchronized method",因为方法不是我们需要用同步来保护的。

我们需要保护数据

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


我相信同步 方法 的想法来自 1970 年代发表的一篇描述 监视器 的论文。 https://en.wikipedia.org/wiki/Monitor_%28synchronization%29 监视器基本上是一个对象,其方法是 all 原子的。当计算机科学家开始探索和形式化思考并行编程的方式时,这是一个有用的抽象;但在很多实际应用中,"monitor" 思想过于严格:仅使用监视器很难最有效地利用多处理器系统。