2

我有一个大型的 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 中启动对象,然后创建多个线程。每个线程搜索大量文档以确定 variable1 的内容是否嵌入到文档中。如果是,我想复制条目,特定于线程,类似于下面:

public Entry(Entry entry) {
    this(entry.getVariable1())
  }

然后我想更改 Copy 的 variable2 的内容而不是原始内容。总结一下:

  1. 对象值在线程之前初始化。
  2. 对象由多个线程共享(只读)。
  3. 当需要修改对象时,会制作对象的副本并对副本进行更改。

这是我的问题。

  1. variable1 和 variable2 的 getter 和 setter 是否需要同步。由于我只在线程之间共享时读取对象,这似乎是不必要的,但如果我错了,请纠正我。
  2. 有没有更好的方法来共享大量信息。(我不想为每个线程复制数组列表,因为它很大,有超过 200K 个对象)?
4

2 回答 2

5
  1. 如果您复制存储在只读共享数组中的对象,则无需同步 getter/setter。

  2. 只要列表是只读的,您的方法似乎很好

于 2012-04-19T12:20:22.437 回答
1

我会有一个集合,它使用每个线程的本地副本来隐藏原始列表。

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);
    }
}
于 2012-04-19T12:22:52.943 回答