Условия, позволяющие различать монитор языка программирования Java и ждать / уведомлять мониторы - PullRequest
0 голосов
/ 05 мая 2011

У меня проблемы с условиями для мониторов Java. Прежде всего, я различаю два вида мониторов:

  • те, кого можно приобрести с помощью wait()
  • те, кого можно приобрести synchronized блоком

Монитор сам по себе является объектом, для которого вызывается wait() или synchronized. Как можно различить эти два типа мониторов? В JVMTI API пишут:

«монитор» означает монитор объекта языка программирования Java.

Это мне не поможет. Однако в дальнейшем они используют термины «Монитор» и «Контролируемый монитор», чтобы различать их по крайней мере в API с точки зрения вызовов функций.

Ответы [ 3 ]

3 голосов
/ 05 мая 2011

По сути, это одно и то же. Они по-разному называются мониторами , мьютексами и (в Java) примитивными блокировками , и эти термины означают почти то же самое в текущем использовании.

Основной шаблон использования, включающий мьютекс с потоками, вызывающими wait() и notify(), называется условие , но один и тот же мьютекс может одновременно использоваться как простая область взаимного исключения.

Фраза " contended monitor" относится к блокировке монитора / мьютекса / примитива, где существует конфликт между областью взаимного исключения. Или, проще говоря, когда один поток содержит мьютекс, а другие ожидают его получения.

Ссылки в Википедии:

(Следует заметить, что эти страницы не являются окончательными и не совсем последовательными. Но тогда большинство ИТ-специалистов играют «быстро и свободно» с терминологией, и очень мало людей читают оригинальные публикации. Но эй ... это как развивается язык.)

1 голос
/ 05 мая 2011

Вы можете , а не получить монитор с помощью wait().Скорее наоборот: сначала вы должны приобрести монитор, используя synchronized , прежде чем вы можете использовать wait() на нем, в противном случае вы получите IllegalMonitorStateException.

Так что различие выописание не существует.

1 голос
/ 05 мая 2011

Они оба одно и то же. «Монитор» обеспечивает обе функции. Обратите внимание, что инструкции VM для блока synchronized называются monitorenter и monitorexit

Конфликт может возникнуть при monitorenter (т. Е. При входе в блок synchronized) или wait (при попытке восстановить блокировку при ее пробуждении.)

Напротив, интерфейсы Lock и Condition из java.util.concurrent представлены как отдельные объекты. Они ведут себя подобно мониторам, хотя (Condition.await() повторно получает блокировку и может потребоваться бороться с Lock.lock() другим потоком.)

...