仅在内部使用局部变量的方法会遇到任何线程问题吗?某处有人提到,带有局部变量的方法被复制到每个线程堆栈帧以供使用,并且不需要为多线程实现同步,除非它使用类级别或静态引用/变量?
最佳答案
如果您的方法仅对参数和本地定义的(而不是类成员)变量进行操作,则无需担心同步问题。
但是……
这意味着您使用的任何可变引用类型必须在您的方法范围内生存和死亡。 (不可变引用类型在这里不是问题。)例如,这是没有问题的:
int doSomething(int myParameter)
{
MyObject working_set = new MyObject();
interim = working_set.doSomethingElse(myParameter);
return working_set.doSomethingElseAgain(interim);
}
MyObject
实例是在您的方法中创建的,它在您的方法中完成所有工作并且正在吐血,等待在您退出方法时被 GC 剔除。
另一方面,这可能是个问题:
int doSomething(int myParameter)
{
MyObject working_set = new MyObject();
interim = working_set.doSomethingElse(myParameter);
another_interim = doSomethingSneaky(working_set);
return working_set.doSomethingElseAgain(another_interim);
}
除非您确切知道 doSomethingSneaky()
中发生了什么,否则您可能需要在某处进行同步。具体来说,您可能必须对 working_set
上的操作进行同步,因为 doSomethingSneaky()
可能会存储对本地 working_set
对象的引用并将其传递当您仍在您的方法或 working_set
的方法中执行操作时,转到另一个线程。在这里你必须更加防御。
当然,如果您只使用基本类型,即使调用其他方法,传递这些值,也不会成为问题。
关于java - 在Java中,不使用静态或类变量的方法需要同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766179/