Estoy confundido por un listado de código en un libro que estoy leyendo, C# 3 en una Cáscara de nuez, en el enhebrado. En el tema sobre el hilo de seguridad en los servidores de aplicaciones, por debajo de código se da como un ejemplo de un UserCache:Por qué bloquear cuando leo desde un diccionario
static class UserCache
{
static Dictionary< int,User> _users = new Dictionary< int, User>();
internal static User GetUser(int id)
{
User u = null;
lock (_users) // Why lock this???
if (_users.TryGetValue(id, out u))
return u;
u = RetrieveUser(id); //Method to retrieve from databse
lock (_users) _users[id] = u; //Why lock this???
return u;
}
}
Los autores explican por qué el método RetrieveUser no está en un bloqueo, esto es para evitar el bloqueo de la caché para un período más largo.
No estoy seguro de por qué bloquear TryGetValue y la actualización del diccionario, ya que incluso con lo anterior, el diccionario se actualiza dos veces si 2 hilos llaman simultáneamente con el mismo ID no recuperado.
¿Qué se logra bloqueando la lectura del diccionario?
Muchas gracias de antemano por todos sus comentarios y opiniones.
Gracias! Eso tiene sentido. Supongo que realmente no hay forma de probarlo de manera determinista. Traté de quitar los bloqueos y lo llamé en un bucle durante miles de veces creando nuevos hilos, después de cambiar el código para que cada hilo siempre escriba después de la lectura, pero funcionó bien. Pero como con la mayoría de los hilos, el hecho de que funcionó para mí no significa que siempre funcionará. ¡Aclamaciones! – eastender
¿Todavía tengo que bloquearlo cuando el diccionario se establece una sola vez y luego solo se leen varios hilos? Probablemente no, pero otra opinión será útil – Adassko
No; múltiples lecturas están bien. – SLaks