HashSet은 HashMap을 기반으로합니다.
HashSet<E>
구현 을 살펴보면 모든 것이에서 관리됩니다 HashMap<E,Object>
.
<E>
의 키로 사용됩니다 HashMap
.
그리고 우리 HashMap
는 그것이 스레드 안전하지 않다는 것을 알고 있습니다. 그래서 우리는 ConcurrentHashMap
Java를 사용합니다.
이것을 바탕으로, 왜 우리가 ?를 기반으로 해야하는 ConcurrentHashSet이 없는지 혼란 스럽 습니다 ConcurrentHashMap
.
내가 놓친 다른 것이 있습니까? Set
다중 스레드 환경에서 사용해야 합니다.
또한, 내가 만들려면 내 자신의 ConcurrentHashSet
난 그냥 대체하여 그것을 달성 할 수 HashMap
에 ConcurrentHashMap
와 같이 나머지를 떠나?
답변
ConcurrentHashSet
항상 파생 할 수 있기 때문에 내장 유형이 없습니다.지도에서 세트를 . 여러 유형의지도가 있으므로 메소드를 사용하여 지정된지도 (또는지도 클래스)에서 세트를 생성합니다.
Java 8 이전에는 다음을 사용하여 동시 해시 맵이 지원하는 동시 해시 세트를 생성합니다. Collections.newSetFromMap(map)
@Matt가 지적한 Java 8에서는를 통해 동시 해시 세트 뷰 를 얻을 수 있습니다 ConcurrentHashMap.newKeySet()
. 이것은 newSetFromMap
빈 맵 객체를 전달해야 했던 이전보다 약간 간단 합니다. 그러나 그것은 특정ConcurrentHashMap
입니다.
어쨌든, 자바 디자이너들은 새로운 맵 인터페이스가 생성 될 때마다 새로운 세트 인터페이스를 만들 수 있었지만, 제 3자가 자신의 맵을 만들 때 그 패턴을 적용하는 것은 불가능할 것입니다. 새로운 세트를 도출하는 정적 메소드를 사용하는 것이 좋습니다. 이 방법은 자체지도 구현을 만들 때도 항상 작동합니다.
답변
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
답변
답변
마찬가지로 레이 톨은 그것뿐만 아니라 쉽게 언급 :
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-