首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个线程之间共享的大型对象数组。线程安全技术

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

Stack Overflow用户
提问于 2012-04-19 12:16:53
回答 2查看 860关注 0票数 2

我有一个大型的对象ArrayList,类似于以下内容

代码语言:javascript
复制
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的内容是否嵌入到文档中。如果是的话,我希望创建一个条目的副本,特定于线程,如下所示:

代码语言:javascript
复制
public Entry(Entry entry) {
    this(entry.getVariable1())
  }

然后,我想修改副本的variable2内容,而不是原件。概括地说:

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

这是我的问题。

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-19 12:20:22

如果要复制存储在只读共享数组中的对象的副本,则不需要同步getters/setters.

  • Your方法,只要列表是只读的

就可以了。

票数 5
EN

Stack Overflow用户

发布于 2012-04-19 12:22:52

我会有一个集合,它用每个线程的本地副本对原始列表进行阴影。

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10227883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档