Tal*_*han 496 java collections concurrency hashmap hashset
HashSet基于HashMap.
如果我们看一下HashSet<E>
实现,一切都在管理之下HashMap<E,Object>
.
<E>
被用作关键词HashMap
.
我们知道这HashMap
不是线程安全的.这就是我们ConcurrentHashMap
在Java中的原因.
基于此,我很困惑,为什么我们没有一个应该基于的ConcurrentHashSet ConcurrentHashMap
?
还有什么我想念的吗?我需要Set
在多线程环境中使用.
另外,如果我想创建我自己的ConcurrentHashSet
,我可以通过替换HashMap
to来实现它,ConcurrentHashMap
并将其余部分保留原样?
Ray*_*oal 547
没有内置类型,ConcurrentHashSet
因为您始终可以从地图派生集合.由于有许多类型的地图,因此您可以使用方法从给定地图(或地图类)生成集合.
在Java 8之前,您可以使用生成由并发哈希映射支持的并发哈希集 Collections.newSetFromMap(map)
在Java 8(由@马特指出的),你可以得到一个并发的哈希集合视图通过ConcurrentHashMap.newKeySet()
.这比旧的newSetFromMap
传递一个空的地图对象要简单一点.但它具体到ConcurrentHashMap
.
无论如何,每次创建新的地图界面时,Java设计者都可以创建一个新的集合界面,但是当第三方创建自己的地图时,这种模式将无法实施.最好使用派生新集的静态方法; 即使您创建自己的地图实现,该方法也始终有效.
小智 98
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
Run Code Online (Sandbox Code Playgroud)
kic*_*hik 74
使用Guava 15,您还可以使用:
Set s = Sets.newConcurrentHashSet();
Run Code Online (Sandbox Code Playgroud)
Bul*_*aza 29
就像Ray Toal所提到的那样简单:
Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();
Run Code Online (Sandbox Code Playgroud)
Mik*_*one 19
看起来Java提供了ConcurrentSkipListSet的并发Set实现.一个SkipList集只是一种特殊的设定实施.它仍然实现Serializable,Cloneable,Iterable,Collection,NavigableSet,Set,SortedSet接口.如果您只需要Set接口,这可能对您有用.
Nir*_*rro 15
正如指出的这个获得并发能够HashSet的最好的办法就是借助于Collections.synchronizedSet()
Set s = Collections.synchronizedSet(new HashSet(...));
Run Code Online (Sandbox Code Playgroud)
这对我有用,我没有看到任何人真正指向它.
编辑这比当前被批准的解决方案效率低,正如Eugene所指出的那样,因为它只是将你的集合包装成一个同步的装饰器,而ConcurrentHashMap
实际上实现了低级别的并发性,它可以将你的集合恢复得很好.所以感谢Stepanenkov先生说清楚了.
http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-
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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
203139 次 |
最近记录: |