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

时间:2019-05-06 06:18:37

标签: 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%确定。

1 个答案:

答案 0 :(得分:3)

不。运行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实例。