【发布时间】:2016-11-14 11:04:40
【问题描述】:
我对@987654321@ 运算符有疑问:
例如,我有一个自定义的线程安全(我希望)列表:
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() 方法,那它是线程安全的吗?
【问题讨论】:
-
是的,因为他们首先锁定或等待锁定
_sync。 -
但是要补充一点——如果你正在实现
IList<StateMessage>,那么你需要实现更多的方法,包括GetEnumerator()、Contains、Count和this[int index]... 等等。我假设您已经意识到这一点,并且上面的代码只是您整个代码的 示例。 -
@rbm,是的,我知道它只是一个示例代码。我在我的代码中实现了所有方法。
-
好的,很酷。除非你真的需要实现自己的线程安全列表,否则你总是可以使用内置类型,比如
ConcurrentBag<T>。 -
@rbm,我知道
ConcurrentBag和其他集合。但我想清除所有项目而不使用while 循环等,
标签: c# multithreading list locking