是否需要锁定此实例方法
本文关键字:实例方法 锁定 是否 | 更新日期: 2023-09-27 18:29:48
对于我可能遇到的问题,我需要更令人信服的答案来在我的解决方案中实现。我不确定我的理解是否正确。以下是实施细节:
在类中,在main方法中,创建类对象C以调用以整数为参数的实例方法:
public <AnyClass> MyMethod(int classVar)
{
return new <AnyClass>(classVar);
// Can have more implementation, using the parameter passed
}
总之,我希望使用同一个类对象在多个线程上调用此方法,参数将是启动线程执行的for循环提供的值。现在在内存中,我们正在执行相同的方法,这需要任何类型的锁定吗。在我看来,不,我已经测试过了,但我不确定理论上为什么不同的线程不会扰乱彼此的参数值,在我的实现中,情况似乎并非如此。
我唯一不能保证的是,哪个线程首先访问并返回,因为这不符合顺序,但如果我不关心它,这个实现是否正确。
请注意,这是试图以独立的方式描述这个问题,我将类似的实施作为复杂项目的一部分。
任何建议/建议都很好。如果你需要澄清,请告诉我。
不,您不必在此处锁定任何内容:
- 代码是只读的,所以两个线程执行相同的代码没有问题
- 每个线程都有自己的堆栈,因此线程不能混淆彼此基于堆栈的变量
但是,当两个线程可能看到同一个对象,并且至少有一个线程对其进行了修改时,您可能需要锁定该对象。
你绝对正确!
不需要任何类型的锁定。当方法中的代码访问参数以外的内容时,需要锁定。如果您的代码访问实例变量或singleton对象,则可能需要锁定。我说可能,因为如果您的代码以只读方式访问这些外部数据,那么您就不需要锁定。
从根本上讲,当且仅当两个并行线程访问并更改(更改)它们之间共享的任何数据时,才需要锁定。
至于方法参数,它们对于每个线程都是个人的。两个线程可以使用不同的参数同时调用相同的方法。两个线程都可以正常工作。只要代码仅限于处理它在参数中获得的数据。
在示例代码中,您没有访问任何共享数据,因此不需要锁定。希望你足够确信。
在编写方法时,您没有访问方法中的任何共享资源(假设AnyClass的构造函数也没有)
此外,您正在传递的参数(int)是按值传递的,因此即使您的方法确实更改了它,它也只会在被调用的方法的堆栈上更改它的本地副本。
因此,从您所展示的内容来看,没有必要进行任何锁定。需要锁定的情况可能是,将对象的同一实例传递到方法中,然后采取措施更改该对象的状态,在这种情况下,您需要同步对对象状态的访问。