2012-04-19 111 views
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中的對象,然後創建多個線程。每個線程搜索大量文檔以確定變量1的內容是否嵌入在文檔中。如果是,我想使進入的副本,具體到線程,類似如下:

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

然後我想改變複製的變量2的內容不是原來的。總結如下:

  1. 對象值在線程化之前被初始化。
  2. 這些對象由多個線程共享(只讀)。
  3. 當需要修改對象時,將創建對象的副本並對副本進行更改。

這是我的問題。

  1. 是否需要同步變量1和變量2的getter和setter。由於我只是在線程之間共享時讀取對象,這看起來不必要,但如果我錯了,請糾正我。
  2. 有沒有更好的方法來分享一個大的數組列表信息。 (我不想複製每個線程的數組列表,因爲它大於200K的對象)?
+1

ArrayList是隻讀的嗎? (我的意思是沒有添加任何東西,沒有刪除。)如果答案是肯定的,你可以安全地共享你的列表。但是,如果您自己修改對象,則可能需要在那裏進行同步。 – biziclop 2012-04-19 12:21:44

回答

5
  1. 如果您存儲在您的只讀共享數組中的對象的拷貝之外還有沒有必要synchornize getter/setter方法。

  2. 你的方法似乎是罰款,只要在列表只讀

+1

+1,對我來說也很好。線程可以爲它們生成的所有複製對象保留一個本地容器。 – 2012-04-19 12:50:40

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