Ci sono situazioni in cui la possibilità di annidare i blocchi sullo stesso thread è molto pratica.
Supponiamo di avere una classe con più metodi. Supponiamo che si desidera avere una molto semplice schema di blocco in questo modo:
class A
{
public void MethodOne()
{
using (locker)
{
...body...
}
}
public void MethodTwo()
{
using (locker)
{
...body...
}
}
}
Ora, se MethodOne
chiamate MethodTwo
, si avrebbe una situazione di stallo a inizio MethodTwo
, se non ci fosse una capacità di bloccaggio rientrante nel monitor . Il thread avrebbe semplicemente bloccato se stesso attraverso il locker
.
Fortunatamente, questo esempio funziona solo in .NET. L'armadietto "sa" quale thread lo ha bloccato e quante volte lascerà passare (solo) il thread proprietario. Il conteggio viene utilizzato per assicurarsi che lo sblocco dalla prospettiva di altri thread in attesa si verifichi solo quando si esce da MethodOne
anziché uscire da MethodTwo
. Quindi questo è un esempio di utile blocco annidato.
D'altro canto, l'esempio menzionato nella domanda sembra venire da this book. Gli autori volevano chiarire che il blocco nidificato è possibile inNET, automaticamente; ma il loro codice di esempio è ideato e non è destinato a comparire nel codice di nessuno, tranne quando si cerca di imparare come funziona il blocco sotto il cofano.
fonte
2012-06-06 07:32:41
vuoi dire che il blocco viene controllato sullo stesso oggetto ogni volta o su oggetti diversi? – Nathan
@Nathan stesso oggetto. –
Correlati: http://stackoverflow.com/questions/12013089/when-would-you-ever-use-nested-locking –