2010-01-13 102 views
3

我正在从Google Collections 0.9升级到1.0。看起来Sets.newConcurrentHashSet()不再可用。我在以下结构中使用它:什么是Sets.newConcurrentHashSet()的替代?

 
public static <K, V> Multimap<K, V> newConcurrentMultimap() 
{ 
    return Multimaps.newMultimap(new ConcurrentHashMap<K, Collection<V>>(), new Supplier>() 
    { 
     @Override 
     public Collection<V> get() 
     { 
      return Sets.<V>newConcurrentHashSet(); 
     } 
    }); 
} 

什么是Sets.newConcurrentHashSet()的最佳替代?

编辑: 此构造的原因是有一个multimap可以安全地从多个线程读取和写入。它用于大多数情况下阅读的场景(并且会被阅读很多)。

问候,

维姆

+0

正如你在下面的评论指出自己,这不会做无论如何你想要它做什么。 – 2010-01-13 19:54:04

回答

8

Sets.newConcurrentHashSet在1.0rc1(commit log)被撤回。我不知道该撤的原因,但你可以使用自己the implementation

Sets.newSetFromMap(new ConcurrentHashMap<V, Boolean>()); 
+0

这正是我现在所做的。我只是想知道它是否会做我所希望的,因为javadoc声明: “当任何并发操作更新多映射时,即使映射和 工厂生成的映射和实例都是,多映射不是线程安全的。”我不喜欢使用同步包装器,因为它不再使其同步但同步。 – 2010-01-13 13:14:01

+1

你想知道它是否有效,因为javadoc明确告诉你它不起作用? :-) – 2010-01-13 19:53:14

+1

它以“退一步,前进两步”的方式撤回;因为我们有计划支持使用'MapMaker'为地图获得选项的相当部分选项,所以我们不希望被所有永恒的'newConcurrentHashSet'方法所困住。对不起,说功能还没有出现。 – 2010-01-13 19:58:54

1

尝试使用MapMaker然后用newSetFromMap()