C# 是否需要锁定此实例方法

C# 是否需要锁定此实例方法,c#,.net,multithreading,C#,.net,Multithreading,对于我可能遇到的问题,我需要更具说服力的答案,以便在解决方案中实施。我不确定我的理解是否正确。实施详情如下: 在类中的main方法中,创建类对象C以调用以integer为参数的实例方法: public <AnyClass> MyMethod(int classVar) { return new <AnyClass>(classVar); // Can have more implementation, using the parameter passed

对于我可能遇到的问题,我需要更具说服力的答案,以便在解决方案中实施。我不确定我的理解是否正确。实施详情如下:

在类中的main方法中,创建类对象C以调用以integer为参数的实例方法:

public <AnyClass> MyMethod(int classVar)
{
    return new <AnyClass>(classVar);
    // Can have more implementation, using the parameter passed
}
公共MyMethod(int classVar)
{
返回新的(classVar);
//可以使用传递的参数进行更多实现
}
大体上,我希望在多个线程上使用相同的类对象调用此方法,参数将是启动线程执行的for循环提供的值。现在在内存中,我们正在执行相同的方法,这是否需要任何类型的锁定。在我看来,没有,我已经测试过了,但我不确定理论上为什么不同的线程不会弄乱彼此的参数值,在我的实现中,情况似乎并非如此

我唯一不能保证的是,哪个线程访问并首先返回,因为这不符合顺序,但如果我不关心它,这个实现是否正确

请注意,这是一个试图以独立的方式描述问题的尝试,我有类似的实现作为一个复杂项目的一部分


任何建议/建议都很好。如果您需要澄清,请告诉我。

不,您不必在此处锁定任何内容:

  • 代码是只读的,所以两个执行相同代码的线程没有问题
  • 每个线程都有自己的堆栈,因此线程不能打乱彼此基于堆栈的变量

但是,当两个线程可能看到同一个对象,并且至少有一个线程对其进行了修改时,您可能需要锁定该对象。

在编写方法时,您没有访问方法中的任何共享资源(假设AnyClass的构造函数也没有)

此外,您要传递的参数(int)是按值传递的,因此即使您的方法确实更改了它,它也只会在被调用的方法的堆栈上更改它的本地副本


因此,从您所展示的内容来看,不需要执行任何锁定。如果您将同一个对象实例传递到方法中,然后做一些事情来更改该对象的状态,那么您可能需要锁定这种情况,在这种情况下,您需要同步对该对象状态的访问。

您完全正确

不需要任何类型的锁定。当方法中的代码访问非通过参数访问的内容时,需要锁定。如果代码访问实例变量或单例对象,则可能需要锁定。我说可能是因为如果代码以只读方式访问这些外部数据,那么就不需要锁定

基本上,当且仅当两个并行线程访问并改变(更改)它们之间共享的任何数据时,才需要锁定

至于方法参数,它们对每个线程都是个人的。两个线程可以使用不同的参数同时调用相同的方法。两条线都可以。只要代码仅限于处理它在参数中获得的数据


在示例代码中,您没有访问任何共享数据,因此不需要锁定。希望您足够信服。

如果
返回新的AnyClass(classVar)是它所做的一切,然后是否。如果有其他事情发生,那么这一切都取决于它是否在修改共享资源。通过值传递的局部变量和函数参数不需要同步,它们在每个线程中都是唯一的。感谢大家的快速响应,这是我的理解,我知道如果不锁定,就无法修改共享资源,在返回时,我只是将值添加到列表类型以供后续使用,因此MT实现似乎没有问题感谢quick ResponseAnks的快速响应