繁体   English   中英

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

[英]Large Object Arrays shared among multiple threads. Thread Safe Techniques

我有一个大型的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())
  }

然后,我想更改“副本”的变量2的内容,而不是原始内容。 总结一下:

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

这是我的问题。

  1. 是否需要同步变量1和变量2的获取器和设置器。 由于仅在线程之间共享时才读取对象,所以这似乎不必要,但是如果我错了,请更正我。
  2. 有没有更好的方法来共享大量信息列表。 (我不想为每个线程复制arraylist,因为它在容纳超过200K对象的情况下非常庞大)?
  1. 如果您复制只读共享数组中存储的对象,则无需同步获取器/设置器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM