我有一个大型的 ArrayList 对象列表,类似于以下内容
class Entry {
private String variable1 = null;
private int variable2 = 0;
public Entry (String variable1) {
this.variable1 = variable1;
}
/* getters and setters for variable1 and 2 are below */
}
我启动 ArrayList 中的对象,然后创建多个线程。 每个线程搜索一大组文档,以确定变量 1 的内容是否嵌入到文档中。 如果是,我想制作特定于线程的条目的副本,如下所示:
public Entry(Entry entry) {
this(entry.getVariable1())
}
然后我想更改副本的变量 2 的内容而不是原始内容。总结一下:
- 对象值在线程处理之前初始化。
- 对象由多个线程共享(只读)。
- 当需要修改对象时,将创建该对象的副本并对副本进行更改。
这是我的问题。
- 变量 1 和变量 2 的吸气剂和二传手是否需要同步。 由于我只在线程之间共享时才读取对象,这似乎没有必要,但如果我错了,请纠正我。
- 有没有更好的方法来共享大量信息列表。 (我不想为每个线程复制数组列表,因为它很大,超过 200K 个对象)?
-
如果您复制存储在只读共享数组中的对象,则无需同步 getter/setter。
-
只要列表是只读的,您的方法似乎就可以
了
我会有一个集合,它用每个线程的本地副本隐藏原始列表。
public class ShadowList<T> {
private final List<T> original;
private final List<T> local;
public ShadowList(List<T> original) {
this.original = original;
local = Arrays.<T>asList((T[]) new Object[original.size()]);
}
public T get(int n) {
T t = local.get(n);
if (t == null)
t = original.get(n);
return t;
}
public void set(int n, T t) {
local.set(n, t);
}
}