2010-05-21 2 views
32

벡터가 동기화되었지만 ArrayList가 동기화되지 않았지만 ArrayList를 Collections.synchronizedList(aList)과 동기화 할 수 있으므로 더 빠르고 더 빠르게 수행 할 수 있습니까?벡터 대 Collections.synchronizedList (ArrayList)

+1

C# 인 경우 질문에 "C#"또는 ".NET"으로 태그를 지정하십시오. – FrustratedWithFormsDesigner

+1

테스트를 작성하고 알아내는 게 어떨까요? – skaffman

+0

사용 패턴을 설명 할 수 있습니까? 1) 많은 쓰기/많은 읽기 2) 적은 쓰기, 많은 읽기, 3) 많은 쓰기, 적은 읽기 4) 몇/몇 가지 최적화가 필요하지 않습니다. – TJR

답변

4

동기화 된 컬렉션은 시간과 위험을 낭비합니다. 그들이 나쁜 이유는 사소한 예는 같은 컬렉션 동시에 루프를 실행하는 두 개의 스레드를 고려하는 것입니다 :

int i = 0; 
while (i < list.size()) 
{ 
    if (testSomeCondition(list.get())) { 
    list.remove(i); 
    else 
    i++; 
} 

우리의 목록은 (예를 들어, 벡터)를 동기화 할 수 있으며,이 코드는 여전히 끔찍하게 휴식 것입니다. 왜? size(), get(), remove()에 대한 개별 호출은 동기화 되었기 때문에 하나의 스레드는 목록에서 항목을 제거하는 반면 다른 스레드는 목록에서 항목을 제거 할 수 있습니다. 즉, 우리는 경쟁 조건이 있으며 동기화 된 컬렉션을 사용하면 아무 것도 얻지 못했습니다.

경주를 수정하려면 컬렉션에서 전체 작업을 동기화하거나 Java 5 동시성 잠금을 사용하여 동일한 작업을 수행해야합니다.

synchronized (list) { 
    int i = 0; 
    while (i < list.size()) 
    { 
    if (testSomeCondition(list.get())) { 
     list.remove(i); 
    else 
     i++; 
    } 
} 

이 코드 블록은 이제 한 번에 하나의 스레드 만 루프를 실행할 수 있으므로 스레드로부터 안전합니다. 이제 동기화 된 컬렉션을 사용할 이유가 없습니다. 우리는 Vector 대신 ArrayList를 사용하여 동기화 된 모든 호출에서 성능 저하를 줄일 수 있습니다.

동기화 된 컬렉션을 사용하지 마십시오. 같은 목록에 여러 스레드가있는 경우 개별 호출이 아닌 목록의 작업을 보호해야합니다.

+9

"동기화 된 컬렉션은 시간 낭비입니다." - 너무 일반적입니다. 동기화 된 콜렉션에는 목적이 있습니다. 당신은 단지 그들을 잘못 사용하는 방법에 대한 예를 들고 있습니다. 밀짚 맨 주장. – thejoshwolfe

+0

그들은 문자 그대로 아주 시간 낭비입니다. synchronized 키워드는 컬렉션이 단일 스레드에서만 사용되는 경우에도 콜 페널티를 부과합니다. 그리고 대부분의 컬렉션은 단일 스레드에서만 독점적으로 사용됩니다. 공유 여부에 관계없이 개별 통화를 동기화하면 경쟁 조건이 허용되므로 목적에 맞지 않습니다. 개발자는 스레드 안전 컬렉션에서 버그를 찾는 데 시간을 낭비합니다. 간단히 말해서 이러한 컬렉션은 유독성이므로 피할 수없는 경우를 제외하고는 결코 사용해서는 안됩니다 (예 : 기존 사례, J2ME 등). – locka

+1

Java 1.3 이하에서는 동기화가 느립니다. 현대 자바에서는 더 좋습니다. http://www.ibm.com/developerworks/java/library/j-jtp04223/index.html 또한, 짚언의 주장과 관련하여 다시. 아무도 단일 스레드로 알려진 상황에서 동기화를 사용하지 않습니다. 귀하의 첫 번째 예제는 평범한 나쁜 프로그래밍이며, 어떤 컬렉션도이를 보상 할 수 없습니다. 당신은 단순히 당신이 사용하는 컬렉션에 상관없이 무엇이 원자이거나 원자가 아닌지 생각해야합니다. ArrayList의 remove() 코드를 살펴보면 목록의 무결성을 유지하기 위해이 메서드를 동기화해야하는 이유가 표시됩니다. – Gus