Programing

ConcurrentHashMap에 대해 ConcurrentHashSet이없는 이유

lottogame 2020. 2. 13. 00:25
반응형

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 세트 세트 구현 단지 특별한 종류이다. 여전히 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을 사용하지 않는 이유는 무엇입니까?

참고 URL : https://stackoverflow.com/questions/6992608/why-there-is-no-concurrenthashset-against-concurrenthashmap



반응형