В этом случае возникает тупик? - PullRequest
2 голосов
/ 09 сентября 2010

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

Объект P вызывает метод синхронизации объекта A ,
который вызывает метод синхронизации объекта B ,
который вызывает метод синхронизации объекта A .

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

Ответы [ 3 ]

9 голосов
/ 09 сентября 2010

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

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

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

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

2 голосов
/ 09 сентября 2010

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

2 голосов
/ 09 сентября 2010

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

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

...