2010-09-09 2 views
2

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

объекта P вызывает синхронизирующий метод объекта ,
, что вызывает синхронизирующий метод объекта B,
, который вызывает синхронный метод объекта A.

Извините, если это выглядит глупо со мной, скорее всего, это так. Но это почему Я спрашиваю. Благодаря!

+0

Почему никто не сказал, что NetBeans может проверить возможные ситуации тупика! –

ответ

9

По информации вы даете - нет, тупиковый может не произойти:

Во-первых, вы не упоминаете несколько потоков. Один поток не может вызвать тупик. Но давайте предположим, что у вас несколько потоков.

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

Объяснение ситуации выглядит следующим образом: Thread-1 получает блокировку, необходимую для ввода methodA, а затем пытается ввести methodB. Если в тот же момент другая нить - Thread-2 вызывает methodB и получает блокировку для нее, то пытается ввести methodA, но Thread-1 уже имеет замок, поэтому Thread-2 ждет. Однако Thread-1 не может ввести methodB, потому что Thread-2 имеет замок. И они ждут вечно (тупик).

2

Нет. Это одна и та же нить, методы синхронизации являются повторно доступными.

Если вы принимаете определение из википедии: «Тупик - это ситуация, при которой два или более конкурирующих друг друга действий ждут другого завершения». У вас есть только одно действие (поток).

2

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

+0

Собственно, это справедливо только для блокировок повторного входа. В java синхронизированные блоки действительно используют блокировки повторного входа, поэтому вы в порядке. –

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