Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > synchronized изнутри


Автор: Askadias 5.7.2011, 10:05
Господа, возник такой вопрос по синхронизации. Когда-то в незапамятные времена еще в универе препод рекомендовал выполнять синхронизацию на простом объекте класса Object. Причем в подробностях описал, зачем и почему это делать именно так. Объясните пожалуйста, с чем это может быть связано? Зачем лочить монитор простого объекта взамен того, к которому осуществляется конкурентный доступ? Связано ли это с синхонизацией кэшей или с блокировкой агрегированных объектов или с чем иным? Что именно происходит в момент блокировки монитора?

Автор: Joss 5.7.2011, 10:55
Не знаю, правильно ли я понял вопрос... Посмотри вот этот http://alexbtw.livejournal.com/1378.html: 

Автор: LSD 5.7.2011, 11:08
Синхронизируется не объект, а некий участок кода. И этот участок синхронизируется по некому объекту. Основная идея синхронизации на поле:
Код

private final Object lock;

состоит в том, что это поле приватное для объекта, и объект самолично распоряжается блокировками на этом объекте и сторонний код не сможет захватить блокировку на этот объект.
Например есть код:
Код

public synchronized void foo() {
  ...
}

это эквивалентно:
Код

public void foo() {
  synchronized(this) {
    ...
  }
}

И в принципе любой поток который имеет ссылку на наш объект может выполнить
Код

  synchronized(myObject) {
    ...
  }

и это приведет к тому, что метод foo() нельзя будет вызвать до того как этот поток не освободит блокировку. По ссылке это все расписано более подробно.

Что же касается synchronized vs ReentrantLock, то в случае с synchronized у JVM гораздо больше простора для маневра и в последних версиях JVM сделано многое для увеличения скорости работы блокировок.

Автор: Askadias 5.7.2011, 13:20
Спасибо. Очень полезно обратить внимание на выведение блокировки наружу... То есть с точки зрения производительности абсолютно нет разницы захватывать монитор сложного или простого объекта?

Автор: LSD 5.7.2011, 14:11
Цитата(Askadias @  5.7.2011,  14:20 Найти цитируемый пост)
То есть с точки зрения производительности абсолютно нет разницы захватывать монитор сложного или простого объекта?

Да.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)