ConcurrentHashMap에 대해 ConcurrentHashSet이없는 이유
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>());
함께 구아바 (15) 당신은 또한 간단하게 사용할 수 있습니다 :
Set s = Sets.newConcurrentHashSet();
마찬가지로 레이 톨은 그것뿐만 아니라 쉽게 언급 :
Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();
Java가 ConcurrentSkipListSet 과 동시 Set 구현을 제공하는 것 같습니다 . SkipList 세트 세트 구현 단지 특별한 종류이다. 여전히 Serializable, Cloneable, Iterable, Collection, NavigableSet, Set, 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
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;
}
}
java.util.concurrent의 CopyOnWriteArraySet을 사용하지 않는 이유는 무엇입니까?
'Programing' 카테고리의 다른 글
XML 파일을 어떻게 구문 분석합니까? (0) | 2020.02.13 |
---|---|
컨텐츠를 기반으로 iframe 크기 조정 (0) | 2020.02.13 |
sizeof (x ++)가 x를 증가시키지 않는 이유 (0) | 2020.02.13 |
Gradle을 사용하여 릴리스 서명 apk 파일을 만드는 방법은 무엇입니까? (0) | 2020.02.13 |
C #에서 디렉토리의 전체 내용을 복사하십시오. (0) | 2020.02.13 |