这个问题是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%确定。
答案 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
实例。