Sono confuso da un elenco di codici in un libro che sto leggendo, C# 3 in poche parole, sul threading. Nella sezione sulla sicurezza del filetto in Application Server, sotto il codice è dato come esempio di un UserCache:Perché bloccare durante la lettura da un dizionario
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;
}
}
Gli autori spiegano il motivo per cui il metodo RetrieveUser non si trova in un blocco, questo è quello di evitare di bloccare la cache per un periodo più lungo.
Sono confuso sul motivo per cui blocco TryGetValue e l'aggiornamento del dizionario poiché anche con quanto sopra il dizionario viene aggiornato due volte se 2 thread chiamano contemporaneamente con lo stesso ID non recuperato.
Cosa si ottiene bloccando la lettura del dizionario?
Molte grazie in anticipo per tutti i vostri commenti e approfondimenti.
Grazie! Ciò ha senso. Immagino che non ci sia davvero alcun modo di dimostrarlo in modo deterministico. Ho provato a rimuovere i blocchi e l'ho chiamato in un ciclo per alcune migliaia di volte creando nuovi thread, dopo aver modificato il codice in modo che ogni thread scrivesse sempre dopo la lettura, ma ha funzionato correttamente. Ma come con la maggior parte dei threading, il fatto che ha funzionato per me non significa che funzionerà sempre. Saluti! – eastender
Devo ancora bloccarlo quando il dizionario viene impostato una volta per thread singolo e viene letto solo da più thread in seguito? Probabilmente no, ma un'altra opinione sarà utile – Adassko
No; più letture vanno bene. – SLaks