在多个线程之间共享的大型对象数组.线程安全技术



我有一个大型的 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. 对象由多个线程共享(只读)。
  3. 当需要修改对象时,将创建该对象的副本并对副本进行更改。

这是我的问题。

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

  2. 只要列表是只读的,您的方法似乎就可以

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

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);
    }
}

最新更新