Как создать собственный потокобезопасный IList<T>?

У меня есть вопрос о lock оператор:

Например, у меня есть собственный потокобезопасный (надеюсь) список:

public class BlockingList<StateMessage> : IList<StateMessage>
{
    private List<StateMessage> _list = new List<StateMessage>();
    private object _sync = new object();


    public void Add(StateMessage item)
    {
        lock (_sync)
            _list.Add(item);
    }

    public bool Remove(StateMessage item)
    {
        lock (_sync)
        {
            return _list.Remove(item);
        }
    }

    public void Clear()
    {
        lock (_sync)
            _list.Clear();
    }
}

Итак, если первый поток добавляет элемент, а второй вызывает Clear() метод в то же время, будет ли потокобезопасным?

1 ответ

Решение

Да, ваш код является потокобезопасным, поскольку методы сначала блокируются или ожидают блокировки _sync объект.

Вы могли бы использовать ConcurrengBag если ты не хочешь писать свой. Пока он не имеет Clear метод, вы можете просто создать новый экземпляр ConcurrentBag и заменить старый.

Другие вопросы по тегам