program tip

CopyOnWriteArrayList는 어떤 상황에서 적합합니까?

radiobox 2020. 11. 5. 07:53
반응형

CopyOnWriteArrayList는 어떤 상황에서 적합합니까?


이 질문에 이미 답변이 있습니다.

CopyOnWriteArrayList 클래스 에 대해 배우고 있습니다.

  • 새 어레이를 복사하는 목적은 무엇입니까?
  • 다른 스레드가 어레이를 읽을 수 있습니까?

따라서 시스템의 동시성이 높고 대부분의 스레드 작업이 쓰기가 아닌 읽기 인 경우를 사용하는 것이 좋습니다 CopyOnWriteArrayList.


링크 에 명시된대로 :

CopyOnWriteArrayList 는 Java ConcurrentHashMap에서 널리 사용되는 사촌과 함께 Java 5 Concurrency API에 도입 된 동시 Collection 클래스 입니다.

CopyOnWriteArrayList같은 구현 목록 인터페이스 ArrayList, Vector그리고 LinkedList하지만 그것 스레드 안전 수집과 벡터 또는 다른 스레드 안전 컬렉션 클래스보다 약간 다른 방식으로 자사의 스레드 안전성을 달성한다.

이름에서 알 수 있듯이 CopyOnWriteArrayList는 모든 변형 작업 (예 : 추가 또는 설정)과 함께 기본 ArrayList의 복사본을 만듭니다. 일반적으로 CopyOnWriteArrayList는 모든 쓰기 작업에 값 비싼 Array 복사를 포함하기 때문에 매우 비싸지 만 Iteration이 돌연변이보다 많은 List가있는 경우에는 매우 효율적입니다. 예를 들어 대부분 ArrayList를 반복하고 너무 자주 수정하지 않아야합니다.

CopyOnWriteArrayList의 Iterator는 안전하고 Iterator가 ArrayList의 별도 복사본에서 작동하기 때문에 Iteration이 시작되면 기본 CopyOnWriteArrayList가 수정 되더라도 ConcurrentModificationException 을 발생 시키지 않습니다 . 따라서 CopyOnWriteArrayList에 대한 모든 업데이트는 Iterator에서 사용할 수 없습니다.

최신 버전을 얻으려면 다음과 같이 새로 읽으십시오. list.iterator();

즉,이 컬렉션을 많이 업데이트하면 성능이 저하됩니다. a를 정렬하려고 CopyOnWriteArrayList하면 목록이 UnsupportedOperationException(정렬이 컬렉션에 대해 세트를 N 번 호출 함) 던지는 것을 볼 수 있습니다 . 90 % 이상의 읽기를 수행 할 때만이 읽기를 사용해야합니다.


새 어레이에 대처하는 목적은 무엇입니까?

기본 배열을 복사하면 데이터의 본질적으로 변경 불가능한 "스냅 샷"에서 반복이 발생하므로 데이터 구조의 모든 반복이 안전하다는 것을 보장합니다.

다른 스레드가 어레이를 읽을 수 있습니까?

일종의. 더 구체적으로 말하면, 모든 스레드가 알 수 ConcurrentModificationException없거나 정의되지 않은 다른 동작에 대한 두려움없이 안전하게 배열을 반복 할 수 있습니다.

따라서 시스템이 동시성이 높고 대부분의 스레드 작업이 쓰지 않고 읽고있는 경우 CopyOnWriteArrayList를 사용하는 것이 좋습니다. 내가 맞아?

아니요. 대부분의 스레드 작업이 목록에 대한 반복 인 경우에만 해당됩니다. 대부분의 활동이 임의 액세스 기반 읽기 인 경우 a ReadWriteLock가 더 좋을 수 있습니다.

의 javadoc에서 CopyOnWriteArrayList

이것은 일반적으로 너무 비용이 많이 드는이지만, 경우에 대안보다 더 효율적일 수 있습니다 탐색 크게 돌연변이 능가하다 운영, 당신이 또는 동기화하지 않을 수 없을 때 유용 순회를 동시 스레드 사이에서 배제 간섭에 필요, 아직.

참고 URL : https://stackoverflow.com/questions/17853112/in-what-situations-is-the-copyonwritearraylist-suitable

반응형