| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||||||||
Синхронизируется не объект, а некий участок кода. И этот участок синхронизируется по некому объекту. Основная идея синхронизации на поле:
состоит в том, что это поле приватное для объекта, и объект самолично распоряжается блокировками на этом объекте и сторонний код не сможет захватить блокировку на этот объект. Например есть код:
это эквивалентно:
И в принципе любой поток который имеет ссылку на наш объект может выполнить
и это приведет к тому, что метод foo() нельзя будет вызвать до того как этот поток не освободит блокировку. По ссылке это все расписано более подробно. Что же касается synchronized vs ReentrantLock, то в случае с synchronized у JVM гораздо больше простора для маневра и в последних версиях JVM сделано многое для увеличения скорости работы блокировок. |
| Автор: Askadias 5.7.2011, 13:20 |
| Спасибо. Очень полезно обратить внимание на выведение блокировки наружу... То есть с точки зрения производительности абсолютно нет разницы захватывать монитор сложного или простого объекта? |
| Автор: LSD 5.7.2011, 14:11 | ||
Да. |