programing

ConcurrentHashMap에 대한 ConcurrentHashSet이 없는 이유

goodcopy 2022. 7. 5. 23:11
반응형

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

반응형