Java 具有弱引用和身份散列的并发集

Java 具有弱引用和身份散列的并发集,java,concurrency,set,guava,weak-references,Java,Concurrency,Set,Guava,Weak References,我想要一个对元素引用较弱的并发集。我想用番石榴的制图器来做这个: Set<Object> concurrentSet = Collections.newSetFromMap( new MapMaker<Object, Boolean>().weakKeys().makeMap()); 任何解决方案如何获得对元素弱引用的并发集?如前所述,MapMaker不是泛型类型;这是。这意味着您可以将任何内容作为键或值,在检索时只需将其转换。引用链接: Concurre

我想要一个对元素引用较弱的并发集。我想用番石榴的
制图器来做这个:

Set<Object> concurrentSet = Collections.newSetFromMap(
    new MapMaker<Object, Boolean>().weakKeys().makeMap());
任何解决方案如何获得对元素弱引用的并发集?

如前所述,
MapMaker
不是泛型类型;这是
。这意味着您可以将任何内容作为键或值,在检索时只需将其转换。引用链接:

   ConcurrentMap<Request, Stopwatch> timers = new MapMaker()
       .concurrencyLevel(4)
       .weakKeys()
       .makeMap();
ConcurrentMap timers=newmapmaker()
.1级(4)
.weakKeys()
.makeMap();

要获得带有
映射
项的
,只需调用。

要充实和注释中暗示的代码,以下是我自己对代码的理解,以获得并发弱集

爪哇,不含番石榴 使用类文档中建议的习惯用法,将并发映射包装为一个集合。使用
Boolean
作为贴图的值类型只是填充,无关紧要

Set< YourObjectTypeGoesHere > concurrentWeakSet = 
    Collections.synchronizedSet(
        Collections.newSetFromMap(
            new WeakHashMap< YourObjectTypeGoesHere , Boolean >()
        )
    )
;
加 要添加到集合中,请执行以下操作:

concurrentWeakSet.add( myObject ); 
迭代 要访问集合中的元素,请执行以下操作:

Iterator<YourObjectTypeGoesHere> iterator = concurrentWeakSet.iterator();
while(iterator.hasNext()) {
    YourObjectTypeGoesHere myObject = iterator.next();
    if( myObject != null ) { // Not sure if needed. Is it possible for object to be garbage-collected but not yet have its entry removed from the Set/Map?
       // Work with the object.
    }
}
Iterator Iterator=concurrentwakset.Iterator();
while(iterator.hasNext()){
YourObjectTypeGoesher myObject=iterator.next();
if(myObject!=null){//不确定是否需要。是否可以对对象进行垃圾收集,但尚未从集合/映射中删除其条目?
//处理对象。
}
}
除去
弱意味着不需要移除元素。随着元素被废弃和垃圾收集,它们将从我们的收集(Map/Set)中消失。

您的原始方法将很好地工作,您只需在调用
makeMap()

Set concurrentSet=Collections.newSetFromMap(
新建MapMaker().weakKeys().makeMap());
使用Java较少使用的通用方法调用语法。
.

我想要一个并发集。那么我如何从中获取一个集合呢?makeMap()是泛型的,所以
ConcurrentMap timers=newmamamaker().concurrentylevel(4.weakKeys().makeMap()
将起作用。@Xaerxess没有注意到“quote”删除了“XML标记”:)将其格式化为代码,谢谢。您仍然需要
Collections.newSetFromMap
,如原始问题所示。
int level = 16; // Basically, the approximate number of threads that may simultaneously try to mutate the map. See Guava doc.
ConcurrentMap<YourObjectTypeGoesHere , Boolean> concurrentWeakMap = new MapMaker().concurrencyLevel( level ).weakKeys().makeMap(); // Google Guava team recommends MapMaker > weakKeys > makeMap as a replacement for weakHashMap.
Set<YourObjectTypeGoesHere> concurrentWeakSet = Collections.newSetFromMap( concurrentWeakMap ); // Concurrency protection carries over to Set wrapper.
concurrentWeakSet.add( myObject ); 
Iterator<YourObjectTypeGoesHere> iterator = concurrentWeakSet.iterator();
while(iterator.hasNext()) {
    YourObjectTypeGoesHere myObject = iterator.next();
    if( myObject != null ) { // Not sure if needed. Is it possible for object to be garbage-collected but not yet have its entry removed from the Set/Map?
       // Work with the object.
    }
}
Set<Object> concurrentSet = Collections.newSetFromMap(
new MapMaker().weakKeys().<Object, Boolean> makeMap());