Как я понимаю, если мы добавим синхронизируемое ключевое слово в наш код, весь блок кода внутри него будет заблокирован для других потоков. В этом случае, почему нам нужно указывать конкретный объект в синхронизированном ключевом слове. , например. синхронизированный (блокировкаObject). Что такое lockObject здесь?Необходимость объекта в синхронизированном блоке
ответ
Если мы добавим синхронизируемое ключевое слово в наш код, весь блок кода внутри него будет заблокирован для других потоков.
Неверный. synchronized
включает механизм, полностью отделенный от вашего блока кода: получение и освобождение блокировки взаимного исключения. Java имеет концепцию synchronized
блоков в качестве удобства для обеспечения надлежащего выпуска блокировки после ее приобретения.
Итак, на самом деле происходит то, что ваш поток получает монитор, связанный с экземпляром, указанным в круглых скобках, затем переходит к выполнению блока кода, а затем освобождает монитор. Между тем ни одна другая нить не может приобрести , что конкретный монитор, но он может очень хорошо приобрести монитор любого другого объекта. Если вы не позаботитесь всегда иметь один и тот же объект в синхронизированном блоке, вы не получите никакого взаимного исключения.
Предположим, у вас есть 2 ресурса, которые вы хотите синхронизировать; ванная комната и холодильник.
Вы хотите, чтобы люди могли перекусить в холодильнике, даже если кто-то пользуется ванной, не так ли?
Таким образом, вы используете разные замки на холодильнике и в ванной комнате.
В терминах программирования это означает, что каждый независимый ресурс может иметь свой собственный lockObject.
Обратите внимание, что ресурс может иметь несколько способов доступа к ним - все аксессоры того же ресурса должны использовать один и тот же замок! В конце концов, если у вас есть две двери в ванную, это не принесет пользы, если вы только заперли одного из них.
+1 для аналогий двух дверей. IMO - одно из самых больших заблуждений, которое noobs о «synchronized» заключается в том, что методы требуют синхронизации. Это не те методы, которые важны, это _data_. –
- 1. Необходимость волатильной записи массива в синхронизированном блоке
- 2. приобретение блокировки другого объекта на синхронизированном блоке
- 3. Wrap CopyOnWriteArrayList в синхронизированном блоке
- 4. Прекращение резьбы в синхронизированном блоке
- 5. Неожиданный код в синхронизированном блоке
- 6. Требуется ли выполнить ConcurrentHashMap в синхронизированном блоке?
- 7. Любые побочные эффекты использования объекта рабочего экземпляра в синхронизированном блоке
- 8. Проблема при блокировке собственного объекта в синхронизированном блоке
- 9. Поведение режима сна в синхронизированном блоке
- 10. Выполняется ли java.util.concurrent.ConcurrentHashMap.putIfAbsent в синхронизированном блоке?
- 11. Java вызова других методов в синхронизированном блоке
- 12. Вызов таймера java в синхронизированном блоке кодов
- 13. Доступ к статической переменной в синхронизированном блоке
- 14. Статический и нестатический объект блокировки в синхронизированном блоке
- 15. java: протоколирование прото-объектов в цикле в синхронизированном блоке
- 16. В Java, может ли коммутация потоков произойти в синхронизированном блоке?
- 17. Почему я получаю исключение IllegalMonitorException в синхронизированном блоке?
- 18. String неизменяемость и метод ожидания в синхронизированном блоке
- 19. Правильно ли я в своем предположении о синхронизированном блоке?
- 20. Работа с синхронизированной синхронизацией Java в синхронизированном блоке не работает
- 21. Что происходит, если объект блокировки изменяется в синхронизированном блоке
- 22. Что такое барьеры чтения и барьеры записи в синхронизированном блоке
- 23. Почему метод wait() в синхронизированном блоке имеет тупик?
- 24. Почему хорошая практика иметь отдельные блокировки вместо блокировки объекта, которые модифицируются в синхронизированном блоке в java?
- 25. Java: ожидание на синхронизированном блоке, кто идет первым?
- 26. создание объекта в блоке
- 27. Что такое необходимость в привилегированном блоке в отражении
- 28. Передача объекта обратно в блоке
- 29. Создание объекта в блоке try
- 30. Необходимость в получении объекта из NSDictionary
Ну, у него есть что-то очень важное для блока кода: он гарантирует, что код не будет выполняться потоком, который не удерживает блокировку, и гарантирует, что поток не покинет блок, не отпуская замок. Возможно, вы пытаетесь сказать, что код не нуждается в защите: причиной использования синхронизированного блока является защита _data_, от которой работает блок. –
Я хочу сказать, что взаимное исключение происходит через механизм, который полностью отделен от блока кода, охватываемого блоком «synchronized». Цель состоит в том, чтобы прояснить это для ОП, который, похоже, застрял в парадигме, где сам блок кода каким-то образом «заблокирован». –
ОК, я понял. Да, это еще один общий вопрос о нобе: «Как получилось, что два потока смогли выполнить этот же синхронизированный блок одновременно?» И ответ всегда есть: «потому что они не синхронизировались на одном объекте». –