2010-01-20 3 views
1

언제 동기화 ArrayList을 사용합니까? 이미 동기화 된 Vector이 있습니다.이미 벡터가있는 경우 ArrayList를 동기화해야하는 이유는 무엇입니까?

+3

어디서 읽었습니까? – Tom

+1

추가 질문을 위해이 질문을 추천합니다. 거기에 유용한 콘텐츠가 있습니다. 예제 제목 : "이미 벡터가있는 경우 ArrayList를 동기화해야하는 이유는 무엇입니까?" –

+0

java.util.Collections를 사용하여 ArrayList를 '동기화'할 수 있습니다 - 귀하의 질문에 그 의미가 있습니까? Collection과 List 인터페이스를 구현하기 때문에 Vector보다 더 좋을 수도 있습니다. – Dan

답변

15

내가 잘못 생각한 것 같습니다. ArrayList is unsynchronized, Vector is.

동기화 중임은 모든 작업이 스레드로부터 안전함을 의미합니다. 두 스레드에서 동일한 벡터를 동시에 사용하면 상태가 손상되지 않습니다. 그러나 이로 인해 속도가 느려집니다.

단일 스레드 환경에서 작업하거나 목록이 스레드로 제한되고 공유되지 않는 경우 ArrayList를 사용하십시오. 동일한 콜렉션을 공유하는 여러 스레드로 작업하는 경우 Vector를 사용하거나 ArrayList를 사용하지만 다른 방식으로 (예 : 수동 또는 래퍼를 통해) 동기화하십시오. 목록 인터페이스

+2

벡터는 거의 쓸모가 없습니다. http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated- "벡터는 각각의 개별 작업에서 동기화됩니다. 당신은하고 싶다. " – Pool

+0

동의합니다. 나는 오랫동안 벡터를 사용하지 않았다. 하지만 나는 여전히 코드를 많이 본다. ArrayLists는 이름 때문에 나를 귀찮게합니다. 그것은 같은 단어의 일부가되어서는 안되는 두 가지가 섞인 것과 같습니다. – Uri

2

Java에서 배열 목록이 동기화된다는 것은 무엇을 의미합니까?

이는 스레드로부터 안전함을 의미합니다.

  • 벡터가 동기화됩니다. Vector의 내용을 변경하는 메서드는 스레드로부터 안전합니다.
  • 반면 ArrayList는 비동기이므로 스레드로부터 안전하지 않습니다.
+0

'Vector'는 스레드로부터 안전하지만, 'Vector'는 일반적으로 사용되지 않습니다. –

+0

@ 톰 : 응용 프로그램에 따라 다르 겠지? – jldupont

+0

추가 잠금없이 스레드 세이프 인'Vector'로는 할 수있는 일이 많지 않습니다. 무작위로 예로 들자면 크기를 읽은 다음 색인을 기준으로 값을 가져 오거나 설정할 수 없습니다. –

0

를 통해 동기화되지 않습니다 동기화 됨

따라서 동시성을 다루지 않을 것이라고 확신 할 때 ArrayList를 사용합니다. 벡터를 사용하면 과도한 공격 일 수 있으며 일 수 있습니다. 일 경우 성능 문제가 발생합니다.

3

ArrayList is not synchronized out of the box.

변경 가능한 배열의 구현. 모든 선택적 목록 작업을 구현하고 null을 포함하여 의 모든 요소를 ​​허용합니다. List 인터페이스를 구현하는 것 외에도이 클래스는 목록을 저장하기 위해 내부적으로 사용되는 배열 의 크기를 조작하는 메서드를 제공합니다. (이 클래스가 동기화되지 것을 제외 벡터와 거의 동일합니다.) 당신이 스레드 안전을 필요가 없습니다 것을 알고있는 곳은 상황에서 몇 가지 성능 문제를 피할 수

(예를 들어, 전체 개인 데이터를 캡슐화) .수집의 두 유형을 반복 할 때, 데이터가 추가되거나, you will throw a ConcurrentModificationException을 제거하면 :이 구현은 동기화 가 아닌

하는 것으로 그들을 반복자를 사용하는 경우에는 ArrayList를하고 벡터 모두 문제가있다. 복수 스레드 이 ArrayList 인스턴스 에 동시에 액세스하고 스레드 중 하나 이상이 구조적으로 목록을 수정하는 경우에는 을 외부 적으로 동기화해야합니다. (A 구조적 변형 하나 이상의 요소 또는 명시 을 추가하거나 삭제하는 조작은 백킹 어레이 크기가 조정이다 단지 요소의 값을 설정하면 구조적 변형이 아니다.)이 일반적 동기에 의해 달성 인 일부 개체에서는 이 자연스럽게 목록을 캡슐화합니다. 같은 개체가 있으면 Collections.synchronizedList 메서드를 사용하여 목록을 "줄 바꿈"해야합니다. 목록 우발적 인 비동기 액세스를 방지하기 위해 이 가장 잘, 작성시에 실시하는 것이 최적입니다

목록 목록 = 에는 Collections.synchronizedList (새 ArrayList를 (...)); 이 클래스의 반복자 및 listIterator의 방법에 의해 반환

반복자 있습니다 르파 :리스트 반복자 자체의 remove 또는 을 통해 이외 방법으로 만든 구조적으로 반복자 후 언제든지 수정 경우 메소드를 추가하면 (자), 반복자는 ConcurrentModificationException를 슬로우합니다 ( ). 따라서 이 동시에 수정 될 경우 임의의 비 결정적 인 동작을 미래에 알 수없는 시간에 수행하는 대신 오류를 신속하고 확실하게 수행하지 못합니다. 불가능 반복자의 fail-fast의 동작은 일반적으로 말해서, 그것은 그대로 보장 할 수 없습니다

주, 비동기의 동시 수정의 이있는 경우, 확실한 보증을 실시합니다. fail-fast iterators ConcreteModificationException 을 최선의 노력으로 throw합니다. 따라서 은 이 정확성에 대해이 예외에 의존하는 프로그램을 작성하는 것이 잘못됩니다. 의 빠른 빠른 동작은 버그 만 감지해야합니다.

그러나 Vector는 유용하지 않지만 다양한 종류의 ArrayList가 제공됩니다. 내 개인적인 마음에 드는 CopyOnWriteArrayList입니다 :

모든 변경 조작이 (등등 설정, 추가)하는 ArrayList의 thread 세이프 인 변수는 기본으로되는 배열의 새로운 카피를 작성하는 것으로 구현된다.

이것은 일반적으로 너무 비싸지 만 순회 연산이 돌연변이보다 훨씬 많을 때 대안보다 효율적일 수 있으며 트래버스를 동기화 할 수 없거나 원하지 않을 때 유용하지만 동시 스레드 간의 간섭을 방지해야 할 때 유용합니다."스냅 샷"스타일 iterator 메소드는 iterator가 생성 된 시점에서 배열의 상태에 대한 참조를 사용합니다. 이 배열은, 반복자의 유효 기간 중에는 변경되지 않기 때문에, 간섭은 불가능하고, 반복자는 ConcurrentModificationException를 throw하지 않는 것이 보증되고 있습니다. 반복기가 작성된 이후에 반복기는 목록에 추가, 제거 또는 변경 사항을 반영하지 않습니다. 반복자 자체에 대한 요소 변경 작업 (제거, 설정 및 추가)은 지원되지 않습니다. 이러한 메소드는 UnsupportedOperationException를 throw합니다.

CopyOnWriteArrayLists는 GUI 작업, 특히 업데이트하는 데이터 세트 (예 : 화면상의 아이콘 이동)를 표시하는 경우에 매우 유용합니다. 표시되는 데이터 목록이 오래된 프레임 하나 (생성자 스레드가 그래픽 업데이트 스레드보다 약간 뒤이기 때문에)를 허용 할 수있는 경우 CopyOnWriteArrayLists는 완벽한 데이터 구조입니다.

+1

+1 나를 꺾어서 COWAL을 (를) 권고합니다. 벡터는 요즘 너무 사랑스럽지 않습니다. 전체 클래스가 사용되지 않는 것은 놀랍습니다. CopyOnWriteArrayList는 모든 종류의 문제를 피할 수있게 해주는 멋진 작은 동물입니다. – BlairHippo

+0

@BlairHippo, 동의합니다. 읽는 동안 데이터를 쓰는 사람의 가능성을 무시할 수 있다는 사실은 세상을 더 밝은 곳으로 만듭니다. –

+0

COWAL에는 하나의 사소한 문제점이 있습니다. 콜렉션에서 작업하도록 설계된 라이브러리 메소드는 항상 COWAL이 제공 될 가능성을 예상하지 못합니다. 예를 들어'static getLastElement (List list)'메소드는 일반적으로'synchronized (list) {return list.get (list.size() - 1); }', 이것은 COWAL에 대해 완전히 손상 될 것입니다. 그냥 사소한주의 사항입니다. –

관련 문제