不影响收集的代码需要相互排斥
List<string> _itemColection = new List<string>();
object _criticalSection = new object();
private void Add(string item)
{
lock (_criticalSection)
{
_itemColection.Add(item);
}
}
private void Remove(string item)
{
lock (_criticalSection)
{
_itemColection.Remove(item);
}
}
private void GetCount()
{
///Is it lock is reuired here?
return _itemColection.Count;
}
//Thread method
private void Run()
{
lock (_criticalSection)
{
foreach (string item in _itemColection)
{
///Some operation
}
}
}
是否在GetCount()方法中需要Mutex。集合值不会更改
答案 0 :(得分:4)
是的,你应该锁定那里。您正在请求访问共享数据,如果您没有某种内存障碍,则无法保证它将是“新鲜”信息。内存模型有时可能是真正的心灵弯曲:)
此外,虽然我期望 List<T>.Count
是一个非常简单的操作,但它理论上可能会很复杂 - 如果另一个线程正在改变东西(例如,添加一个项目,然后需要缓冲区扩展),当它计算出计数时,理论上 会遇到麻烦。
基本上,除非声明类型对于您的特定场景是线程安全的,否则我总是确保您不会同时对其执行两个操作。
答案 1 :(得分:1)
在实践中它可能不需要,但我会把它包括在内以保证安全。 _itemCollection.Count是一个属性,所以你有效地在集合上调用一个函数,你无法保证这个函数在做什么。
答案 2 :(得分:0)
简单回答是肯定的,因为值可能会更改,您将无法获得最新数据。
答案 3 :(得分:0)
这是关于确定性的一个极好的问题..
在我看来,当你遇到一些并发时,总是需要使用锁。
修改
我们只是在需要更改某些信息的操作中使用锁定,而不需要在只读对象中使用它。
祝你好运