2015-09-09 5 views
1

я просматривал исходный код для DatagramSocket и я нашел это:В Java «синхронизирован» эквивалентно `synchronized (this)`?

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

Чтобы предоставить более точный ответ на вопрос заголовка: использование спецификатора 'synchronized' для метода эквивалентно' synchronized (this) 'для всего тела метода только для * нестатических * методов. Для * статических * методов он эквивалентен 'synchronized (NameOfYourClass.class)' вокруг всего тела метода. – mastov

ответ

3

Да, два фрагмента кода эквивалентны.

Мы можем только догадываться, почему тот, кто написал этот код, выбрал более подробную версию. Это может быть личное предпочтение кого-то или исторический артефакт. Например, он мог быть ранее synchronized(someObject) или мог покрыть только часть метода, и тот, кто реорганизовал этот метод, не преобразовал раздел synchronized в метод synchronized.

1

Есть ли причина, по которой разработчики языка решили не использовать синхронный метод здесь?

Я не знаю, их умы, но, на мой взгляд, первый способ лучше. Мне очень не нравится фраза «синхронизированный метод», потому что методы не то, что нам нужно защитить с синхронизацией.

Нам необходимо защитить данные.

Вся точка synchronized блоков, является то, что часто для того, чтобы продвигать состояние программы, одна нить должна создать временную, недопустимый состояние. При подходящем использовании synchronized мы можем предотвратить просмотр любого другого потока недопустимым состоянием. Это означает синхронизацию не только блока кода, который меняет состояние, но и любого другого блока кода, который может проверить состояние.


Я считаю, что идея для синхронизированных методов пришла из статьи, опубликованной в 1970-х годах, описывающих мониторов. https://en.wikipedia.org/wiki/Monitor_%28synchronization%29 Монитор в основном является объектом, методы которого являются все атомарным. Это была полезная абстракция, когда компьютерные ученые начали изучать и формализовать способы мышления о параллельном программировании; но во многих практических приложениях идея «монитора» слишком строгая: сложно использовать многопроцессорную систему с использованием только мониторов.

Смежные вопросы