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