Как создать собственный потокобезопасный 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
и заменить старый.