java - 在Java中,不使用静态或类变量的方法需要同步吗?

标签 java multithreading static synchronization local

仅在内部使用局部变量的方法会遇到任何线程问题吗?某处有人提到,带有局部变量的方法被复制到每个线程堆栈帧以供使用,并且不需要为多线程实现同步,除非它使用类级别或静态引用/变量?

最佳答案

如果您的方法仅对参数和本地定义的(而不是类成员)变量进行操作,则无需担心同步问题。

但是……

这意味着您使用的任何可变引用类型必须在您的方法范围内生存和死亡。 (不可变引用类型在这里不是问题。)例如,这是没有问题的:

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/

相关文章:

java - 如何读取特定格式的内存映射文件?

JAVA : time factor regarding Array Dimension

java - (Java, Socket) BufferedReader 阻塞线程,无法 .close()

javascript - Django:静态文件图像 URL 路径中断,主页模板除外

c++ - C++ 的类模板中是否可以有一个通用的、非专用的静态成员?

static - 配置 NGinx 以提供静态文件和代理传递某些 url

java - 使用 ffmpeg 生成视频以使用 JavaFX 播放

java - 从一个方法返回多次?

.net - SempahoreSlim 作为异步代码中的锁的正确用法是什么?

java - 一个或多个监听器无法启动 SringMVC 电子商务项目