Per spiegare comportamento perché è ben definito e non sarà mai sicuro:
parte: This answer has better details about how locks actually work
Il blocco avviene a livello Thread
, in modo da chiamare una seconda volta sullo stesso filo sarà ridondante . Penserei che non avrebbe alcuna penalizzazione delle prestazioni (anche se ciò dipenderebbe dal modo in cui sono esattamente scritte le parti interne di .Net, quindi non posso garantire che)
Molte volte si dovrebbe avere una funzione pubblica che chiama un altro funzione pubblica nella tua classe, che entrambi hanno bisogno del lucchetto se usati separatamente. Se questo non fosse permesso, il seguente non avrebbe funzionato:
private Dictionary<string, int> database = new Dictionary<string, int>();
private object databaseLock = new object();
public void AddOrUpdate(string item)
{
lock (databaseLock)
{
if (Exists(item))
database.Add(item, 1);
else
++database[item];
}
}
public bool Exists(string item)
{
lock (databaseLock)
{
//... Maybe some pre-processing of the key or item...
return database.ContainsKey(item);
}
}
Perché vuoi usare un simile costrutto? – Jehof
Puoi descrivere alcune situazioni in cui dovresti farlo? Sto cercando di capirlo, ma ...? –
@ MatíasFidemraizer Una funzione ricorsiva può bloccare la stessa risorsa. –