java - 方法的局部变量是否被线程共享?

标签 java multithreading

这个问题是 this question 的延伸.

如果在这个问题中 AbcRunnable 有一个成员变量作为一个类,而该类只具有从 Runnable 调用的方法,该怎么办?例如

public class AbcRunnable implements Runnable
{
     private final AbcSupplier supplier;

     public void run() {

        List<Message> messages = supplier.get();
     }
}

public class AbcSupplier implements Supplier<List<Message>> {

     public List<Message> get() {
         List<Message> list = new ArrayList<>();
         /*
          Some operations on list
         */
         return list
     }
}

因此,在这种情况下,如果 2 个线程共享 AbcSupplier 的对象,因为我们只创建它的一个实例。那么,他们也会共享那里的局部变量列表吗?或者他们不会?

我尝试自己运行它。对我来说,看起来它们正在被共享,但并不是 100% 确定。

最佳答案

没有。运行 AbcRunnable.run() 的两个线程不会共享 AbcSupplier.get() 返回的列表的同一实例。这是因为 get() 每次运行时都会创建一个 ArrayList 实例。

这是一个会导致线程共享同一列表的版本:

public class AbcSupplier implements Supplier<List<Message>> {

     List<Message> list = new ArrayList<>();
     public AbcSupplier() {
         ......
         Some operations on list
         ......
     }

     public List<Message> get() {
         return list;
     }
}

在这种情况下,相同的 AbcSupplier 实例将返回相同的 List 实例。

关于java - 方法的局部变量是否被线程共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55999721/

相关文章:

java - 从 PUT HttpServletRequest 获取参数?

ios - UIProgressView 没有更新?

multithreading - LWJGL、Clojure、OpenGL 命令的单线程

java - 使用 Java 访问 Google Directory API

java - JAVA以表格形式保存数据(用户统计)

java - Spring Autowired 和 Builder 注释

java - 原子引用用法

C#多线程无符号递增

multithreading - 为什么 netty 每个套接字共享相同的线程进行读写?

java - 使用exp4j数学表达式评估器