2015-09-16 2 views
0

Как я понимаю, если мы добавим синхронизируемое ключевое слово в наш код, весь блок кода внутри него будет заблокирован для других потоков. В этом случае, почему нам нужно указывать конкретный объект в синхронизированном ключевом слове. , например. синхронизированный (блокировкаObject). Что такое lockObject здесь?Необходимость объекта в синхронизированном блоке

ответ

1

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

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

Итак, на самом деле происходит то, что ваш поток получает монитор, связанный с экземпляром, указанным в круглых скобках, затем переходит к выполнению блока кода, а затем освобождает монитор. Между тем ни одна другая нить не может приобрести , что конкретный монитор, но он может очень хорошо приобрести монитор любого другого объекта. Если вы не позаботитесь всегда иметь один и тот же объект в синхронизированном блоке, вы не получите никакого взаимного исключения.

+0

Ну, у него есть что-то очень важное для блока кода: он гарантирует, что код не будет выполняться потоком, который не удерживает блокировку, и гарантирует, что поток не покинет блок, не отпуская замок. Возможно, вы пытаетесь сказать, что код не нуждается в защите: причиной использования синхронизированного блока является защита _data_, от которой работает блок. –

+0

Я хочу сказать, что взаимное исключение происходит через механизм, который полностью отделен от блока кода, охватываемого блоком «synchronized». Цель состоит в том, чтобы прояснить это для ОП, который, похоже, застрял в парадигме, где сам блок кода каким-то образом «заблокирован». –

+0

ОК, я понял. Да, это еще один общий вопрос о нобе: «Как получилось, что два потока смогли выполнить этот же синхронизированный блок одновременно?» И ответ всегда есть: «потому что они не синхронизировались на одном объекте». –

1

Предположим, у вас есть 2 ресурса, которые вы хотите синхронизировать; ванная комната и холодильник.

Вы хотите, чтобы люди могли перекусить в холодильнике, даже если кто-то пользуется ванной, не так ли?

Таким образом, вы используете разные замки на холодильнике и в ванной комнате.

В терминах программирования это означает, что каждый независимый ресурс может иметь свой собственный lockObject.

Обратите внимание, что ресурс может иметь несколько способов доступа к ним - все аксессоры того же ресурса должны использовать один и тот же замок! В конце концов, если у вас есть две двери в ванную, это не принесет пользы, если вы только заперли одного из них.

+1

+1 для аналогий двух дверей. IMO - одно из самых больших заблуждений, которое noobs о «synchronized» заключается в том, что методы требуют синхронизации. Это не те методы, которые важны, это _data_. –

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