1) 이것은 CopyOnWriteArraySet
매우 간단한 구현입니다. 기본적으로 배열에 요소 목록이 있으며 목록을 변경할 때 배열을 복사합니다. 이 시점에서 실행되는 반복 및 기타 액세스는 기존 어레이를 계속 사용하여 리더와 라이터 간의 동기화가 필요하지 않습니다 (쓰기 자체를 동기화해야 함). 일반적으로 빠른 설정 작업 (특히 contains()
)은 배열이 선형 시간으로 검색되므로 매우 느립니다.
자주 읽고 (반복) 자주 변경하지 않는 아주 작은 세트에만 이것을 사용하십시오. (Swings 리스너 세트는 예일 수 있지만 실제로는 세트가 아니며 EDT에서만 사용해야합니다.)
2) Collections.synchronizedSet
단순히 원래 세트의 각 방법 주위에 동기화 된 블록을 감 쌉니다. 원본 세트에 직접 액세스해서는 안됩니다. 이것은 세트의 두 가지 메소드를 동시에 실행할 수 없음을 의미합니다 (하나는 다른 쪽이 끝날 때까지 차단됨)-스레드 안전하지만 여러 스레드가 실제로 세트를 사용하는 경우 동시성이 없습니다. 반복자를 사용하는 경우 반복자 호출 사이의 세트를 수정할 때 ConcurrentModificationExceptions을 피하기 위해 일반적으로 외부에서 동기화해야합니다. 성능은 원래 세트의 성능과 유사합니다 (그러나 일부 동기화 오버 헤드 및 동시에 사용되는 경우 차단).
동시성이 낮고 모든 변경 사항이 다른 스레드에 즉시 표시되도록하려면이 옵션을 사용하십시오.
3) O (log n)에서 가장 기본적인 작업을 수행 ConcurrentSkipListSet
하는 동시 SortedSet
구현입니다. 반복자가 추가 된 후 제거 및 읽기 / 반복을 수행 할 수 있으며, 반복자가 작성된 이후 변경 사항에 대해 반복 할 수도 있고 그렇지 않을 수도 있습니다. 대량 작업은 단순히 여러 번의 단일 호출이며 원자 적으로는 아닙니다. 다른 스레드는 그 중 일부만 관찰 할 수 있습니다.
분명히 요소에 대한 전체 순서가있는 경우에만 사용할 수 있습니다. 이것은 O (log n) 때문에 너무 크지 않은 세트에 대해 동시성이 높은 상황에 이상적인 후보처럼 보입니다.
4) ConcurrentHashMap
(및 그로부터 파생 된 세트)의 경우 : 여기에서 가장 기본적인 옵션은 hashCode()
O (1)에서 ( 평균적으로 좋고 빠르면 평균 이지만 HashMap /과 같이 O (n)으로 저하 될 수 있습니다) 해시 세트. 쓰기에 대한 동시성은 제한적이며 (테이블이 분할되고 필요한 액세스에서 쓰기 액세스가 동기화 됨) 읽기 액세스는 자체와 쓰기 스레드에 완전히 동시 적이지만 현재 변경 내용의 결과를 아직 보지 못할 수 있습니다. 쓴). 반복자는 생성 된 이후 변경 사항을 보거나 보지 못할 수 있으며 대량 작업은 원자 적이 지 않습니다. 크기 조정이 느리기 때문에 (HashMap / HashSet의 경우) 생성시 필요한 크기를 추정하여 3/3이 가득 찼을 때 크기를 조정할 때 크기의 1/3 이상을 사용하여이를 피하십시오.
큰 세트, 양호하고 빠른 해시 함수가 있고 맵을 작성하기 전에 세트 크기 및 필요한 동시성을 추정 할 수있는 경우이를 사용하십시오.
5) 여기서 사용할 수있는 다른 동시지도 구현이 있습니까?