我对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()
方法,它是否是线程安全的?
答案 0 :(得分:2)
是的,您的代码是线程安全的,因为这些方法首先锁定或等待锁定_sync
对象。
如果您不想自己编写,可以使用ConcurrengBag
。虽然它没有Clear
方法,但您只需创建ConcurrentBag
的新实例并替换旧实例。