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

时间:2012-04-19 12:16:54

标签: java multithreading synchronization

我有一个类似于以下

的大型对象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. 当需要修改某个对象时,会创建该对象的副本并对该副本进行更改。
  4. 以下是我的问题。

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

2 个答案:

答案 0 :(得分:5)

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

  2. 只要列表是只读

  3. ,您的方法似乎没问题

答案 1 :(得分: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);
    }
}