Ich bin verwirrt von einem Code-Listing in einem Buch ich lese, C# 3 in Kürze, auf Threading. Im Thema auf Thema Sicherheit in Anwendungsserver, unter Code als Beispiel eines UserCache gegeben:Warum sperren beim Lesen aus einem Wörterbuch
in einem Schlossstatic 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;
}
}
Die Autoren erklären, warum die RetrieveUser Methode ist nicht, das ist zum Sperren den Cache zu vermeiden ein längerer Zeitraum.
Ich bin verwirrt, warum sperren Sie den TryGetValue und das Update des Wörterbuchs, denn auch mit dem oben genannten wird das Wörterbuch zweimal aktualisiert, wenn 2 Threads gleichzeitig mit der gleichen nicht abgerufenen ID aufrufen.
Was wird erreicht, wenn das Wörterbuch gelesen wird?
Vielen Dank im Voraus für alle Ihre Kommentare und Einblicke.
Danke! Das macht Sinn. Ich denke, es gibt wirklich keine Möglichkeit, es deterministisch zu beweisen. Ich habe versucht, die Sperren zu entfernen und habe es einige tausend Mal in einer Schleife aufgerufen, indem ich neue Threads erstellt habe, nachdem ich den Code so geändert habe, dass jeder Thread nach dem Lesen immer schreibt, aber es hat gut funktioniert. Aber wie bei den meisten Threads, bedeutet es nicht, dass es immer funktioniert. Prost! – eastender
Muss ich es noch sperren, wenn Dictionary einmal mit einem einzelnen Thread gesetzt ist und danach nur von mehreren Threads gelesen wird? Wahrscheinlich nicht aber eine andere Meinung wird nützlich sein – Adassko
Nein; mehrere Lesevorgänge sind in Ordnung. – SLaks