在 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" 思想过于严格:仅使用监视器很难最有效地利用多处理器系统。
我正在查看 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" 思想过于严格:仅使用监视器很难最有效地利用多处理器系统。