Sobes.tech
Middle+

ConcurrentDictionary колдонбостон Dictionary кантип ишке ашыруу керек?

sobes.tech AI

AIден жооп

ConcurrentDictionary колдонбостон агымсыздыкка туруктуу Dictionary түзүү үчүн System.Threading кеңейтүүсүнөн синхрондоштуруу primitives колдонсо болот.

Негизги жактар:

  1. Бардык сөздүктү жабуу (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;
        }
    }
    

    Артыкчылыктары: Жөнөкөй ишке ашыруу. Кемчиликтери: Жогорку атаандаштыкта төмөнкү иштөө ылдамдыгы, анткени бардык операциялар блоктолот.

  2. 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 көбүнесе көп окуу операциялары үчүн артыкчылыкка ээ.