我正在查看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;
}
为什么语言设计师选择不在这里使用同步方法?
答案 0 :(得分:3)
是的,这两个代码片段是等效的。
我们只能猜到为什么编写此代码的人选择了更详细的版本。它可能是某人的个人偏好,也可能是历史人工制品。例如,它之前可能是synchronized(someObject)
或者可能只覆盖了方法的一部分,重构该方法的任何人都没有将synchronized
部分转换为synchronized
方法。
答案 1 :(得分:1)
为什么语言设计师选择不在这里使用同步方法?
我不知道他们的思想,但在我看来,第一种方式更好。我真的不喜欢“同步方法”这个短语,因为方法不是我们需要通过同步来保护的。
我们需要保护数据。
synchronized
块的整个点通常是,为了推进程序的状态,一个线程必须创建一个临时的,无效的状态。通过适当使用synchronized
,我们可以防止任何其他线程看到无效状态。这意味着不仅要同步正在改变状态的代码块,还要同步任何其他可以检查状态的代码块。
我认为同步方法的想法来自20世纪70年代发表的描述监视器的论文。 https://en.wikipedia.org/wiki/Monitor_%28synchronization%29监视器基本上是一个对象,其方法是 all atomic。当计算机科学家开始探索和形成关于并行编程的思考的方法时,这是一个有用的抽象;但在许多实际应用中,“监视”的想法过于严格:仅使用监视器最有效地使用多处理器系统。