Πώς υλοποιείτε ένα Dictionary χωρίς να χρησιμοποιείτε το ConcurrentDictionary;
sobes.tech AI
Απάντηση από AI
Για την υλοποίηση ενός ασφαλούς για ροές Dictionary χωρίς τη χρήση του ConcurrentDictionary, μπορούν να εφαρμοστούν συγχρονιστικά primitives από το namespace System.Threading.
Βασικές προσεγγίσεις:
-
Κλείδωμα ολόκληρου του λεξικού (
lock): Τυλίγουμε όλες τις λειτουργίες ανάγνωσης και εγγραφής σε ένα μπλοκlockχρησιμοποιώντας το ίδιο αντικείμενο συγχρονισμού.// Αντικείμενο για συγχρονισμό πρόσβασης στο λεξικό private readonly object _lockObject = new object(); private readonly Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>(); public void AddOrUpdate(TKey key, TValue value) { lock (_lockObject) { if (_dictionary.ContainsKey(key)) { _dictionary[key] = value; } else { _dictionary.Add(key, value); } } } public bool TryGetValue(TKey key, out TValue value) { lock (_lockObject) { return _dictionary.TryGetValue(key, out value); } } public bool TryRemove(TKey key, out TValue value) { lock (_lockObject) { if (_dictionary.TryGetValue(key, out value)) { _dictionary.Remove(key); return true; } return false; } }Πλεονεκτήματα: Απλή υλοποίηση. Μειονεκτήματα: Χαμηλή απόδοση σε περιπτώσεις υψηλού ανταγωνισμού, καθώς το σύνολο του λεξικού μπλοκάρεται ακόμα και κατά τις αναγνώσεις.
-
Χρήση
ReaderWriterLockSlim: Επιτρέπει τον διαχωρισμό των κλειδώσεων για λειτουργίες ανάγνωσης και εγγραφής. Πολλά νήματα μπορούν να διαβάζουν ταυτόχρονα, αλλά μόνο ένα να γράφει.private readonly ReaderWriterLockSlim _lockSlim = new ReaderWriterLockSlim(); private readonly Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>(); public void AddOrUpdate(TKey key, TValue value) { _lockSlim.EnterWriteLock(); try { if (_dictionary.ContainsKey(key)) { _dictionary[key] = value; } else { _dictionary.Add(key, value); } } finally { _lockSlim.ExitWriteLock(); } } public bool TryGetValue(TKey key, out TValue value) { _lockSlim.EnterReadLock(); try { return _dictionary.TryGetValue(key, out value); } finally { _lockSlim.ExitReadLock(); } } public bool TryRemove(TKey key, out TValue value) { _lockSlim.EnterWriteLock(); try { if (_dictionary.TryGetValue(key, out value)) { _dictionary.Remove(key); return true; } return false; } finally { _lockSlim.ExitWriteLock(); } }Πλεονεκτήματα: Καλύτερη απόδοση σε περιπτώσεις έντονων λειτουργιών ανάγνωσης σε σύγκριση με το
lock. Μειονεκτήματα: Πιο πολύπλοκη υλοποίηση από το απλόlock.
Η επιλογή μεταξύ αυτών των προσεγγίσεων εξαρτάται από τη συγκεκριμένη χρήση του λεξικού, την αναλογία λειτουργιών ανάγνωσης και εγγραφής, και τις απαιτήσεις απόδοσης. Το ReaderWriterLockSlim είναι συνήθως προτιμότερο σε περιπτώσεις συχνών λειτουργιών ανάγνωσης.