列出<t>多个编写器线程安全性</t>

时间:2010-07-08 05:49:39

标签: c# multithreading .net-2.0

如果我有多个线程调用List对象的Add方法而没有读者,那么在调用Add来保证线程安全之前,我是否只需要锁定List对象?

4 个答案:

答案 0 :(得分:3)

通常最好锁定一个单独的(不可变的)对象...锁定你正在修改的同一个对象是不好的做法 应该谨慎行事

private readonly object sync = new object();
private List<object> list = new List<object>();

void MultiThreadedMethod(object val)
{
    lock(sync)
    {
        list.Add(val);
    }
}

在这样的基本情况下你不会有问题,但是如果你的列表有可能被改变(不是列表的内容,而是列表本身),那么当你只想锁定一个对象时,你可能会遇到锁定两个对象的情况。

答案 1 :(得分:1)

答案 2 :(得分:1)

是。但您也可以考虑将List和“new”子类化为Add方法。这将允许您封装锁。只要没有访问基本List,它就会很好用。这种技术用于XNA视频游戏中的简单树结构。

答案 3 :(得分:0)

我认为这些已经在此处联系过,但我发现它们非常有用和有趣:

Thread safe collections are hard

Thread safe collection