为了充实接受的答案和评论中暗示的代码,这是我自己对代码的看法,以获得并发弱集。
Java,没有番石榴
使用类文档中建议的习语,使用Collections.newSetFromMap将并发 Map 包装为 Set。用作Boolean
地图的 Value 类型只是填充物,无关紧要。
Set< YourObjectTypeGoesHere > concurrentWeakSet =
Collections.synchronizedSet(
Collections.newSetFromMap(
new WeakHashMap< YourObjectTypeGoesHere , Boolean >()
)
)
;
可以推断参数化类型,将代码简化为:
Set< YourObjectTypeGoesHere > concurrentWeakSet =
Collections.synchronizedSet(
Collections.newSetFromMap(
new WeakHashMap<>() // Types inferred, so omitted.
)
)
;
番石榴
或者,我们可以MapMaker
从 Google Guava 库中使用。
我们没有使用该文档的示例包装WeakHashMap ,而是根据 Guava 文档的建议将WeakHashMap 替换为来自Google Guava的MapMakernew MapMaker().weakKeys().makeMap()
的地图 call 。Guava 文档指出,此映射“使用对象标识比较键,而 WeakHashMap 使用Object.equals
”。
用法
使用它比理解它更容易!
实例化
要创建并发弱集,请复制粘贴以下代码。替换两次出现的YourObjectTypeGoesHere
.
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.
}
}
去除
弱意味着不需要删除元素。随着元素被废弃和垃圾收集,它们从我们的集合(Map/Set)中消失。