2012-04-19 2 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에 있습니다. 각 스레드는 variable1의 내용이 문서에 포함되어 있는지 판별하기 위해 대량의 문서 집합을 검색합니다. 이 경우, 나는 아래로, 스레드와 관련된 유사한 항목의 사본을 만들고 싶어 :

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

는 그때하지 원본을 복사의 변수 2의 내용을 변경하려는. 요약하려면 :

  1. 개체 값은 스레딩 전에 초기화됩니다.
  2. 개체가 여러 스레드에서 공유 (읽기 전용)됩니다.
  3. 개체를 수정해야 할 경우 개체 복사본이 만들어지고 복사본이 변경됩니다.

내 질문 사항은 다음과 같습니다.

  1. variable1과 variable2에 대한 getter와 setter를 동기화해야합니까? 스레드간에 공유 할 때 개체를 읽는 중이므로 불필요한 것 같습니다. 그러나 내가 틀렸다면 수정하십시오.
  2. 정보의 큰 arraylist를 공유하는 더 좋은 방법이 있습니까? (각 스레드에 대해 arraylist를 복사하고 싶지는 않습니다. 왜냐하면 200K 개 이상의 객체가 커지기 때문입니다)?
+1

arraylist는 읽기 전용입니까? (아무 것도 추가하지 않고, 아무 것도 제거하지 않음을 의미합니다.) 대답이 '예'일 경우 안전하게 목록을 공유 할 수 있습니다. 그러나 개체 자체를 수정하면 동기화가 필요할 수 있습니다. – biziclop

답변

5
  1. 당신의 getter/setter를 synchornize 할 필요가 없습니다 것보다 당신의 읽기 전용 공유 배열에 저장된 객체의 복사본을 만들 경우. 목록 만

+1

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