2015-02-06 1 views
1

나는 그런 목록을 작성하는 경우 :동기화 된 목록을 동기화하는 이유는 무엇입니까?

List<MyObj> myobjs = Collections.synchronizedList(new ArrayList<MyObj>()); 

관련 문서는이 목록은 요소를 반복하기 위해 동기화 될 필요가 반환 것을 주장하고있다. 그러나 일반 목록을 동기화하고 동기화 된 블록으로 보호 할 수 있습니다. 그래서, 왜 "synchronizedList"가 필요합니까?

지정된 목록으로 백업 된 동기화 된 (스레드로부터 안전한) 목록을 반환합니다. 직렬 액세스를 보장하려면 모든 백킹 목록에 대한 액세스가 반환 된 목록을 통해 수행되는 것이 중요합니다.

그것의 반복 처리를하는 경우, 사용자가 수동으로 돌려 목록에 동기를 잡을 필요가 있습니다 비 결정적 동작이 발생할 수도 있습니다 조언을 따르지

List list = Collections.synchronizedList(new ArrayList()); 
     ... 
    synchronized (list) { 
     Iterator i = list.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 

실패. 지정된리스트 가 직렬화 가능한 경우, 리턴 된리스트는 직렬화 가능하게됩니다.

매개 변수 : 동기화 목록에 "줄 바꿈"목록을 나열하십시오. 지정된 목록의 동기화 된보기. synchronizedList

+1

이미 답변을 드렸습니다. http://stackoverflow.com/questions/9468187/collections-synchronizedlist-and-synchronized. 간단한 연산은 스레드 안전성이 보장되지만 반복 연산은 간단한 연산이 아닙니다. –

+0

질문이 비슷하지만 정확한 중복은 아님에 동의합니다. 즉, 동기화가 필요한 경우 SynchronizedList의 용도가 무엇인지 물었고 romsky는 SynchronizedList를 사용할 때 동기화의 목적이 무엇인지 질문했습니다. – paiego

+0

간단한 조작으로 만 동기화 할 수 있기 때문에 ... 어떻게 할 수 있습니까? –

답변

3

는 대부분의 경우 수동 동기화를 방지 할 수있는 간이 래퍼이지만, 반복하지 않을 때.

정상적인 비동기 목록을 사용하면 여러 스레드에서 사용하는 경우 항상 수동으로 동기화해야하므로 synchronizedList을 사용하면 편리 할 수 ​​있습니다.

synchronizedList이 필요한 경우 목록에서 동기화되지 않는 제 3 자 코드에 목록을 전달했지만 동기화가 계속 필요한 경우 일 수 있습니다. 그러나 제 3 자 코드가 목록을 반복하거나 다른 비 원자 연산을 사용하지 않는다는 사실에 의존하기 때문에 오류가 발생하기 쉽습니다. 따라서 가능하면이 모든 것을 피하는 것이 가장 좋습니다 (예 : 목록 복사).

+1

감사합니다 ... romski의 게시물에서 "Collections.sort()와 같은 반복기를 사용하는 모든 메서드는 동기화 된 블록 안에 캡슐화해야합니다." – paiego

관련 문제