ConcurrentHashMap에 대한 ConcurrentHashSet이 없는 이유
HashSet은 HashMap을 기반으로 합니다.
보면HashSet<E>
구현, 모든 것이 관리됩니다.HashMap<E,Object>
.
<E>
의 열쇠로 사용됩니다.HashMap
.
그리고 우리는 알고 있다HashMap
스레드 세이프가 아닙니다.그래서 저희가ConcurrentHashMap
자바어.
이 때문에 왜 Concurrent Hash Set이 없는 건지 헷갈립니다.
제가 또 놓친 게 있나요?사용할 필요가 있다Set
멀티플렉스 환경에서 사용할 수 있습니다.
또한 나만의 것을 만들고 싶다면ConcurrentHashSet
이 시스템을 교체하기만 하면HashMap
로.ConcurrentHashMap
나머지는 그대로 놔두고?
의 빌트인 타입은 없습니다.ConcurrentHashSet
지도에서 항상 집합을 도출할 수 있기 때문입니다.맵에는 여러 종류가 있기 때문에 특정 맵(또는 맵클래스)에서 세트를 생성하는 방법을 사용합니다.
Java 8 이전 버전에서는 다음과 같이 동시 해시 맵에 의해 지원되는 동시 해시 세트를 생성했습니다.
Java 8(@Matt가 지적)에서는 를 통해 동시 해시 집합 뷰를 얻을 수 있습니다.이것은 옛날보다 조금 심플하다newSetFromMap
빈 맵 객체를 전달해야 합니다.하지만 이것은 특정 사항입니다ConcurrentHashMap
.
어쨌든 Java 설계자는 새로운 맵인터페이스를 작성할 때마다 새로운 세트인터페이스를 작성할 수 있었지만, 서드파티가 독자적인 맵을 작성할 때는 그 패턴을 적용할 수 없습니다.새로운 세트를 도출하는 스태틱 방식을 사용하는 것이 좋습니다.이 접근방식은 독자적인 맵 실장을 작성하는 경우에도 항상 기능합니다.
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
Guava 15에서는, 다음의 기능도 간단하게 사용할 수 있습니다.
Set s = Sets.newConcurrentHashSet();
Ray Toal이 언급한 것처럼, 이것은 다음과 같이 간단합니다.
Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();
Java는 ConcurrentSkipListSet과 함께 동시 세트 구현을 제공하는 것 같습니다.Skip List Set은 특별한 종류의 세트 구현일 뿐입니다.또한 Serializable, Cloneable, Itable, Collection, NavigableSet, Set, SortedSet 인터페이스를 구현합니다.이것은 Set 인터페이스만 필요한 경우에 사용할 수 있습니다.
이것에서 알 수 있듯이 동시 실행 가능한 HashSet을 얻는 가장 좋은 방법은 다음과 같습니다.Collections.synchronizedSet()
Set s = Collections.synchronizedSet(new HashSet(...));
이것은 나에게 효과가 있었고 나는 그것을 가리키는 사람을 본 적이 없다.
편집 이것은 유진이 지적한 바와 같이 현재 적용된 솔루션보다 덜 효율적입니다. 왜냐하면 이것은 단지 동기화된 장식기로 당신의 세트를 감싸는 반면,ConcurrentHashMap
실제로 낮은 수준의 동시성을 구현하여 세트를 적절하게 지원할 수 있습니다.스테파넨코프 씨가 분명히 해줘서 고마워요
http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-
guava's로 하나 살 수 있어요.Java 6 에서는 이 메서드도 있습니다.
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E>{
private final ConcurrentMap<E, Object> theMap;
private static final Object dummy = new Object();
public ConcurrentHashSet(){
theMap = new ConcurrentHashMap<E, Object>();
}
@Override
public int size() {
return theMap.size();
}
@Override
public Iterator<E> iterator(){
return theMap.keySet().iterator();
}
@Override
public boolean isEmpty(){
return theMap.isEmpty();
}
@Override
public boolean add(final E o){
return theMap.put(o, ConcurrentHashSet.dummy) == null;
}
@Override
public boolean contains(final Object o){
return theMap.containsKey(o);
}
@Override
public void clear(){
theMap.clear();
}
@Override
public boolean remove(final Object o){
return theMap.remove(o) == ConcurrentHashSet.dummy;
}
public boolean addIfAbsent(final E o){
Object obj = theMap.putIfAbsent(o, ConcurrentHashSet.dummy);
return obj == null;
}
}
사용하지 않는 이유:copyOnWriteArraySet from java.util.concurrent?
언급URL : https://stackoverflow.com/questions/6992608/why-there-is-no-concurrenthashset-against-concurrenthashmap
'programing' 카테고리의 다른 글
Vue에서 임의 슬롯 액세스 (0) | 2022.07.12 |
---|---|
대규모 웹 사이트의 Vuex 스토어 아키텍처 (0) | 2022.07.12 |
C API 설계:누가 할당해야 합니까? (0) | 2022.07.05 |
버스 오류란 무엇입니까?세그멘테이션 장애와 다른가요? (0) | 2022.07.05 |
계산된 루프 생성에서 getter 반환 (0) | 2022.07.05 |