如何创建自定义线程安全的IList <t>?

时间:2016-11-14 11:04:40

标签: c# multithreading list locking

我对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 个答案:

答案 0 :(得分:2)

是的,您的代码是线程安全的,因为这些方法首先锁定或等待锁定_sync对象。

如果您不想自己编写,可以使用ConcurrengBag。虽然它没有Clear方法,但您只需创建ConcurrentBag的新实例并替换旧实例。