是否需要锁定此实例方法

时间:2013-09-02 08:45:34

标签: c# .net multithreading

对于我可能有的问题,我需要在我的解决方案中实施更有说服力的答案。我不确定我的理解是否正确。以下是实施细节:

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

public <AnyClass> MyMethod(int classVar)
{
    return new <AnyClass>(classVar);
    // Can have more implementation, using the parameter passed
}

在main中,我希望在多个线程上调用此方法,使用相同的类对象,该参数将是for循环启动线程执行的值。现在在内存中我们正在执行相同的方法,这需要任何类型的锁定。在我看来没有,我已经测试过,但我不确定理论上为什么,不会有不同的线程搞砸了彼此的参数值,在我的实现中似乎并非如此。

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

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

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

3 个答案:

答案 0 :(得分:2)

不,你不必在这里锁定任何东西:

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

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

答案 1 :(得分:1)

你是完全正确的!

不需要任何锁定。当方法中的代码访问除参数之外的其他内容时,需要锁定。如果您的代码访问实例变量或单例对象,那么可能需要锁定。我说可能因为如果您的代码以只读方式访问这些外部数据,那么您将不需要锁定。

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

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

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

答案 2 :(得分:0)

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

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

因此,根据您所显示的内容,无需进行任何锁定。你需要锁定的东西可能是你将一个对象的同一个实例传入你的方法,然后做一些事情来改变那个对象的状态,在这种情况下你需要同步访问状态对象。