这个问题是 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/