1

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

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

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

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

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

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

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

4

3 回答 3

2

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

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

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

于 2013-09-02T08:49:56.563 回答
1

你是绝对正确的!

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

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

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

在示例代码中,您没有访问任何shared-data,因此不需要锁定。希望你足够相信。

于 2013-09-02T09:01:44.100 回答
0

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

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

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

于 2013-09-02T08:53:23.993 回答