Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程是否共享方法的局部变量?_Java_Multithreading - Fatal编程技术网

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

Java 线程是否共享方法的局部变量?,java,multithreading,Java,Multithreading,这个问题是问题的延伸 如果在这个问题中,AbcRunnable将一个成员变量作为一个类,该类只包含从Runnable调用的方法,该怎么办。例如 public class AbcRunnable implements Runnable { private final AbcSupplier supplier; public void run() { List<Message> messages = supplier.get(); } }

这个问题是问题的延伸

如果在这个问题中,
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
     }
}
public类AbcRunnable实现可运行
{
私人最终ABC供应商;
公开募捐{
列表消息=supplier.get();
}
}
公共类ABC供应商实现供应商{
公共列表get(){
列表=新的ArrayList();
/*
列表中的一些操作
*/
返回列表
}
}
因此,在本例中,如果两个线程共享
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;
     }
}
公共类ABC供应商实施供应商{
列表=新的ArrayList();
公共ABC供应商(){
......
列表中的一些操作
......
}
公共列表get(){
退货清单;
}
}

在这种情况下,相同的
abc供应商
实例将返回相同的
列表
实例。

您如何初始化供应商?您试图找出什么?局部变量是局部变量。对于方法的每次调用,都有一个单独的列表实例,无论该实例发生在哪个线程上。不,两个线程都有自己的堆栈,因此两个线程都有自己的方法副本,所以方法中的变量不会被共享。