ConcurrentDictionary колдонбостон Dictionary кантип ишке ашыруу керек?
sobes.tech AI
AIден жооп
ConcurrentDictionary колдонбостон агымсыздыкка туруктуу Dictionary түзүү үчүн System.Threading кеңейтүүсүнөн синхрондоштуруу primitives колдонсо болот.
Негизги жактар:
-
Бардык сөздүктү жабуу (
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 көбүнесе көп окуу операциялары үчүн артыкчылыкка ээ.