Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改对象的属性时锁定对象比较_C#_Multithreading_Locking - Fatal编程技术网

C# 更改对象的属性时锁定对象比较

C# 更改对象的属性时锁定对象比较,c#,multithreading,locking,C#,Multithreading,Locking,想象一种情况,在这种情况下,我得到了这种结构(请注意,这是无法改变的): 此结构用于在多个线程上运行的程序。字段_点在并行过程中被修改(意味着它被读取和写入),因此在访问此字段时,我需要为给定对象设置一个锁-这是通过这样做实现的(我使用对象作为锁,我也不想更改): 这一切都很好。虽然在某个地方(仍处于并行过程中),我有这样一个比较: MyClass anotherObject = new MyClass(); if (myObject == anotherObject) { DoSometh

想象一种情况,在这种情况下,我得到了这种结构(请注意,这是无法改变的):

此结构用于在多个线程上运行的程序。字段_点在并行过程中被修改(意味着它被读取和写入),因此在访问此字段时,我需要为给定对象设置一个锁-这是通过这样做实现的(我使用对象作为锁,我也不想更改):

这一切都很好。虽然在某个地方(仍处于并行过程中),我有这样一个比较:

MyClass anotherObject = new MyClass();
if (myObject == anotherObject)
{
  DoSomething();
}

请注意,==运算符在MyClass中没有重载。所以,我的最终问题是,我是否需要锁定这两个对象(myObject和另一个对象)来进行比较,还是这样就可以了?base==运算符实际上是做什么的?根据文档,它“如果两个操作数引用同一个对象,则返回true”。这是否意味着它只比较对象的地址?在这种情况下,应该不需要锁。

根据您报告的代码,并且由于MyClass中没有重载
=
运算符,因此我认为刚刚实例化的另一个对象不可能等于MyClass的另一个现有实例。但是,如果myObject和另一个object引用同一个实例,那么锁定一个引用相当于锁定另一个引用。
该字段\u点在并行过程中被修改(意味着它被读取和写入),因此在访问该字段时,我需要为给定对象锁定。
否,您不需要,只要你在做原子操作。同样,如果没有重写==运算符,则比较是线程安全的,因此不需要锁定
MyClass myObject = new MyClass();
lock (myObject)
{
   myObject._point = ...;
}
MyClass anotherObject = new MyClass();
if (myObject == anotherObject)
{
  DoSomething();
}