如果我有多个线程调用List对象的Add方法而没有读者,那么在调用Add来保证线程安全之前,我是否只需要锁定List对象?
答案 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)