我正在学习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。有人可以确认一下,还是我错过了什么?
感谢。
答案 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是其中之一或引用你就不需要锁定。