para explicar el comportamiento por lo que está bien definido y nunca fallará:
Aparte: This answer has better details about how locks actually work
El bloqueo se produce a nivel Thread
, así que llamar por segunda vez en el mismo subproceso será redundante . Pensaría que no tendría ninguna penalización de rendimiento (aunque eso dependería de cómo se escriban exactamente las partes internas de .Net, por lo que no puedo garantizarlo)
Muchas veces tendría una función pública que llama a otra función pública en su clase, que ambos necesitan el candado cuando se usan por separado. Si no se permitiera esto, fallaría lo siguiente:
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);
}
}
¿Por qué desea utilizar una construcción así? – Jehof
¿Puedes describir alguna situación en la que necesites hacerlo? Estoy tratando de entender eso, ¿pero ...? –
@ MatíasFidemraizer Una función recursiva puede bloquear el mismo recurso. –