ConcurrentSkipListSet은 언제 유용합니까?


84

방금 Java 6 API에서이 데이터 구조를 보았고 언제 유용한 리소스가 될지 궁금합니다. 나는 scjp 시험을 위해 공부하고 있으며 그것을 언급하는 모의 시험 문제를 보았음에도 불구하고 Kathy Sierra의 책에서 다루지 않았습니다.

답변:


175

ConcurrentSkipListSetConcurrentSkipListMap 은 여러 스레드에서 액세스 할 정렬 된 컨테이너가 필요할 때 유용합니다. 이들은 본질적으로 동시 코드에 대한 TreeMap 및 TreeSet과 동일합니다.

JDK 6의 구현 은 IBM의 Maged Michael이 작성한 고성능 동적 잠금 해시 테이블 및 목록 기반 세트기반 으로 합니다. 이는 CAS (비교 및 스왑) 작업을 사용하여 건너 뛰기 목록에서 많은 작업을 원자 적으로 구현할 수 있음을 보여줍니다 . 잠금이 없으므로 synchronized이러한 클래스를 사용할 때 (대부분의 작업에서) 오버 헤드에 대해 걱정할 필요가 없습니다 .

현재 Java 에는 Red-Black 트리 기반의 동시 Map / Set 구현이 없습니다. 문헌을 조금 살펴본 결과 동시 RB 트리가 건너 뛰기 목록을 능가하는 성능을 보여주는 몇 개의 논문 을 찾았 지만, 이러한 테스트 중 상당수 는 현재 주요 아키텍처의 하드웨어에서 지원되지 않는 트랜잭션 메모리 로 수행되었습니다 .

구현이 잘 알려져 있고 잠금 해제가 간단하고 이식 가능하기 때문에 (CAS 사용) JDK 사람들이 여기에 스킵 목록을 사용했다고 가정하고 있습니다. 누구든지 명확하게 관심이 있다면 그렇게하십시오. 궁금해.


1
성능이 뛰어난 방식으로 다중 스레드 환경에서 고유 한 레코드를 추적하려는 경우에도 유용합니다.
anataliocs

4

건너 뛰기 목록은 정렬 된 목록이며 log (n) 성능으로 수정하는 데 효율적입니다. 그 점에서 그것은 TreeSet과 같습니다. 그러나 ConcurrentTreeSet은 없습니다. 내가 들었던 것은 스킵리스트가 구현하기 매우 쉽다는 것입니다. 그게 아마도 그 이유 일 것입니다.

어쨌든 동시에 정렬되고 효율적인 집합이 필요할 때 ConcurrentSkipListSet을 사용할 수 있습니다.


2

여러 스레드에서 동시에 안전하게 액세스 할 수있는 집합이 필요할 때 유용합니다. 또한 약하게 일관성을 유지하여 적절한 성능을 제공합니다. 세트를 반복하는 동안 삽입이 안전하게 만들어 질 수 있지만 반복자가 해당 삽입을 볼 것이라는 보장은 없습니다.


1

ConcurrentSkipListMap은 내가 자체 개발 한 캐시를위한 복제 계층을 구현해야 할 때 환상적인 발견이었습니다. Map 측면은 캐시를 구현했으며 기본 List 측면을 통해 객체가 캐시에 나타난 순서를 추적 할 수 있습니다. 이 목록의 "건너 뛰기"측면은 목록의 한 지점에서 개체를 제거하고 캐시에서 교체 될 때 끝까지 범프하는 것이 효율적이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.