2013-01-17 3 views
0

간단한 질문입니다. 다음 코드는 스레드로부터 안전합니까?HashTable 안의 ArrayList는 thread safe입니다

  1. 그렇다면 더 좋은 방법이 있습니까 ..?
  2. 아니요, 이유는 무엇입니까? 어떻게 스레드를 안전하게 만들 수 있을까요? 스레드로부터 안전하지 않습니다 HashtableArrayList 때문에 내부에 있기 때문에 ArrayList

내 주요 의심. 따라서 그 부분이 Hashtable 일 경우 똑같은 일이 일어납니다. 그렇다면, 더 좋은 방법이

Hashtable<Thread, List<String>> threadObjects = new Hashtable<Thread, List<String>>(); 
// lets assume some object is added. 
synchronized (threadObjects) 
    { 
    thread = Thread.currentThread(); 
    List<String> v = threadObjects.get(thread); 
    if (null != v) 
    { 
     // do something 
    } 
    } 

감사

+3

스레드에 대한 목록으로 목록을 전달하지 않는 이유는 무엇입니까? – fge

+1

1. 게시 한 부분은 스레드로부터 안전하지만 목록을 처리하는 방법에 따라 다릅니다. 2. Hashtable은 오래된 것이므로 사용하지 마십시오. 예를 들어'ConcurrentHashMap'을 사용하거나'Collections.synchronizedMap (new HashMap())'만 사용하십시오. –

+0

@fge 아니, 나는 싫어. –

답변

5

입니다 ..? ArrayList에이 스레드 안전하지 않기 때문에

예,하지만 때문에 해시 테이블 내부의 ArrayList의 ThreadLocal을>

내 주요 의혹을 사용합니다.

보통이 코드를 사용하면 ArrayList가 한 스레드에서만 액세스 할 수 있습니다. 물론이 패턴을 따르지 않으면 스레드로부터 안전합니다.

참고 : synchronized (threadObjects)은이 경우 아무런 차이가 없습니다.

4

다음 코드는 thread safe ...입니까?

  • 지도를 만들고지도에 항목을 추가하는 코드는 스레드 안전

  • 다른 코드는 동기를하지 않고지도를 사용하지 :

예 ... 그 제공 (코드 당)

  • 지도에서 동기화하지 않고 목록 개체를 업데이트하는 코드가 없습니다.
  • 외부 동기화 된 데이터 구조의 스레드 안전성은 데이터 구조를 사용하는 모든 코드를 검사해야만 확인할 수 있습니다.

    피터가 말한 것처럼 ThreadLocals이 더 나은 솔루션이 될 수 있지만 목록 개체가 적절한 잠금없이 변경되면 잠재적 인 스레드 안전 문제가 있습니다.

    3

    ThreadLocal을 사용하여 스레드 별 데이터를 저장할 수 있습니다. 예를 들어 :

    private final ThreadLocal<List<String>> threadObjects = 
        new ThreadLocal<List<String>>() { 
         @Override protected List<String> initialValue() { 
          return new ArrayList<String>(); 
         } 
        }; 
    
    public void foo() { 
        for (String s : threadObjects.get()) { 
         // do something with each string in this thread's list 
        } 
    } 
    

    이 테이블이 동기화를 포함하여 ThreadLocal를 구현 안에 당신을 위해 자신을 유지하기 때문에 Hashtable 방식에 비해 스레드 별 데이터를 추적하는 더 나은 방법입니다. 다른 스레드에 대한 참조를 게시하지 않는 한 ArrayList 인스턴스에서 추가 동기화가 필요하지 않습니다. 각각의 쓰레드는 동시성 문제없이 만족 스럽기 때문에 자신 만의 ArrayList 인스턴스를 가질 것이다.당신이 명시 적으로 null 로컬 스레드를 설정하지 물론 가정, threadObjects.get()의 결과에 null에 대한 검사를 방지 할 수 있기 때문에

    initialValue()의 최우선은 편리합니다.