Java:Что, если вообще что-либо, блокируется синхронизированными методами, кроме объекта, к которому они принадлежат?

StackOverflow https://stackoverflow.com/questions/609963

Вопрос

Теперь, я не уверен, глупый ли это вопрос, пожалуйста, потерпите меня, если это так.

Является ли блокировка объекта "рекурсивной", i.e.если два объекта имеют ссылки на третий объект в своих полях, и поток выполняет синхронизированный метод для одного из двух, может ли любой другой поток получить доступ к третьему объекту?

// a and b are some objects that implement Runnable
// they both reference the same third object
a.ref = c;
b.ref = c;

// a is run in a thread and processes some data in a loop for a long time
// the method the loop belongs to is declared synchronized
threadA = new Thread(a);
threadA.start();

a.someSyncedMethod(); // this would block ...
b.ref.someOtherSyncedMethod(); // ... but would this?
a.ref.someOtherSyncedMethod(); // ... and how about this?
Это было полезно?

Решение

Стоит разделить понятия "блокировка" и "блокировка объекта".Нет никакой реальной идеи "блокировки объекта" - есть "получение (и снятие)" блокировки связанный с объект.Да, это звучит так, будто я придираюсь, но различие важно, потому что если вы говорите о объект будучи заблокированным, похоже, что никакие другие потоки не смогут что-либо изменить в объекте, пока эта блокировка удерживается.

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

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

Лично мне не нравятся синхронизированные методы - я хотел бы сделать это понятнее, явно синхронизируя с (частной, окончательной) переменной-членом, которая используется только для синхронизации.

Другие советы

a.someSyncedMethod(); // this would block ...

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

В JVM каждому объекту принадлежит так называемый монитор. Только один поток может одновременно иметь монитор, связанный с данным объектом. Синхронизированный - это средство, с помощью которого вы указываете текущему потоку, чтобы он взял монитор, прежде чем продолжить.

Также сам класс владеет монитором для статических методов.

Значение слова "блокировка". (на самом деле этот вариант называется монитором) - это соглашение, ограничения доступа не применяются.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top