[java] ConcurrentHashMap에 대해 ConcurrentHashSet이없는 이유

HashSet은 HashMap을 기반으로합니다.

HashSet<E>구현 을 살펴보면 모든 것이에서 관리됩니다 HashMap<E,Object>.

<E>의 키로 사용됩니다 HashMap.

그리고 우리 HashMap는 그것이 스레드 안전하지 않다는 것을 알고 있습니다. 그래서 우리는 ConcurrentHashMapJava를 사용합니다.

이것을 바탕으로, 왜 우리가 ?를 기반으로 해야하는 ConcurrentHashSet이 없는지 혼란 스럽 습니다 ConcurrentHashMap.

내가 놓친 다른 것이 있습니까? Set다중 스레드 환경에서 사용해야 합니다.

또한, 내가 만들려면 내 자신의 ConcurrentHashSet난 그냥 대체하여 그것을 달성 할 수 HashMapConcurrentHashMap와 같이 나머지를 떠나?



답변

ConcurrentHashSet항상 파생 할 수 있기 때문에 내장 유형이 없습니다.지도에서 세트를 . 여러 유형의지도가 있으므로 메소드를 사용하여 지정된지도 (또는지도 클래스)에서 세트를 생성합니다.

Java 8 이전에는 다음을 사용하여 동시 해시 맵이 지원하는 동시 해시 세트를 생성합니다. Collections.newSetFromMap(map)

@Matt가 지적한 Java 8에서는를 통해 동시 해시 세트 를 얻을 수 있습니다 ConcurrentHashMap.newKeySet(). 이것은 newSetFromMap빈 맵 객체를 전달해야 했던 이전보다 약간 간단 합니다. 그러나 그것은 특정ConcurrentHashMap 입니다.

어쨌든, 자바 디자이너들은 새로운 맵 인터페이스가 생성 될 때마다 새로운 세트 인터페이스를 만들 수 있었지만, 제 3자가 자신의 맵을 만들 때 그 패턴을 적용하는 것은 불가능할 것입니다. 새로운 세트를 도출하는 정적 메소드를 사용하는 것이 좋습니다. 이 방법은 자체지도 구현을 만들 때도 항상 작동합니다.


답변

Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());


답변

함께 구아바 (15) 당신은 또한 간단하게 사용할 수 있습니다 :

Set s = Sets.newConcurrentHashSet();


답변

마찬가지로 레이 톨은 그것뿐만 아니라 쉽게 언급 :

Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();


답변

Java가 ConcurrentSkipListSet 과 동시 Set 구현을 제공하는 것 같습니다 . SkipList 세트 세트 구현 단지 특별한 종류이다. 아직 직렬화, Cloneable을,의 Iterable, 컬렉션, 해 NavigableSet, 설정, SortedSet의 인터페이스를 구현합니다. Set 인터페이스 만 필요한 경우이 기능을 사용할 수 있습니다.


답변

에 의해 지적 동시성-수 HashSet의를 얻을 수있는 최선의 방법을 이용하여입니다Collections.synchronizedSet()

Set s = Collections.synchronizedSet(new HashSet(...));

이것은 나를 위해 일한 나는 사람이 정말 가리키는 보지 못했어요.

편집 Eugene은 세트를 동기화 된 데코레이터로 랩핑하고 ConcurrentHashMap실제로는 낮은 수준의 동시성을 구현하고 세트를 정상적으로 백업 할 수 있기 때문에 Eugene이 지적한대로 현재 입증 된 솔루션보다 덜 효율적 입니다. 이를 분명히 해준 Stepanenkov 씨에게 감사드립니다.

http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-


답변

구아바를 사용 Sets.newSetFromMap(map)하여 구할 수 있습니다 . Java 6에도 그 방법이 있습니다java.util.Collections