类实例的C#线程安全性

时间:2011-01-10 09:32:12

标签: c# multithreading

我正在学习C#,我对类实例副本的线程安全性感到困惑,如下所示:

eg:
  classA objA;
  classA objB = objA;

  objA.field1 = value2; //do I need lock around modification of field1?

  //let say we pass the objB to another thread
  objB.field1 = value1 //do I need a lock for objB because of the modification of field1?

我很困惑,因为来自C ++的背景,C#中的类是引用类型。如果objA和objB都指向相同的内存,那么我需要一个锁来保护同时写入field1。有人可以确认一下,还是我错过了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

你提到你的C ++背景,所以也许你可以把你的C#代码想象成这个C ++代码:

classA objA;
classA &objB = objA; //note reference

objA.field1 = value2; //do I need lock around modification of field1?
                      //Answer : yes if someone else has access to the object

如果多个线程修改/突变,您应该锁定对象。这可以使用属性而不是公共字段轻松完成。或者使用简单的方法。

有时修改基本类型不需要锁定。但对于大多数关于并发访问/变异的情况,锁定是最简单,最安全的解决方案。

//let say we pass the objB to another thread
//do I need a lock for objB because of the modification of field1?
Thread newThread = new Thread((classB b) => b.field1 = value1);

是的,提供对象是可变的。

答案 1 :(得分:0)

这取决于。根据{{​​3}},以下类型是原子的:
bool, char, byte, sbyte, short, ushort, uint, int, float,和参考类型。

如果你没有任何进一步的依赖关系,那么如果field1是其中之一或引用你就不需要锁定。