Istnieją sytuacje, czy umiejętność umieszczania zamków w tym samym wątku jest bardzo praktyczna.
Załóżmy, że masz klasę z wieloma metodami. Załóżmy, że chcemy mieć bardzo prosty schemat blokowania takiego:
class A
{
public void MethodOne()
{
using (locker)
{
...body...
}
}
public void MethodTwo()
{
using (locker)
{
...body...
}
}
}
Teraz, jeśli MethodOne
rozmowy MethodTwo
, to masz impasu na początku MethodTwo
, jeśli nie było reentrant zdolność blokowania na monitorze . Wątek po prostu zablokowałby się przez locker
.
Na szczęście ten przykład działa tylko w .NET. Szafka "wie", który wątek zablokował ją i ile razy i pozwoli (tylko) na posiadanie wątku. Licznik służy do upewnienia się, że odblokowanie z perspektywy innych oczekujących wątków dzieje się tylko przy wychodzeniu z MethodOne
, a nie przy wychodzeniu z MethodTwo
. Jest to więc przykład użytecznego blokowania zagnieżdżonego.
Z drugiej strony przykład wspomniany w pytaniu wydaje się pochodzić z this book. Autorzy chcieli wyjaśnić, że zagnieżdżanie w gnieździe jest możliwe w.NET, automatycznie; ale ich przykładowy kod jest wymyślny i nie ma na celu pojawiać się w czyimś kodzie, chyba że próbuje dowiedzieć się, jak działa blokowanie pod maską.
masz na myśli, że zamek jest sprawdzany na tym samym obiekcie za każdym razem lub na różnych obiektach? – Nathan
@Nathan same obj. –
Powiązane: http://stackoverflow.com/questions/12013089/when-would-you-ever-use-nested-locking –