2013-07-13 53 views
2

我需要一个并发的弱哈希集而不使用Guava集合。 哪一个是正确的? 有任何副作用?来自地图的同步设置或来自同步地图的设置?

private Set<Session> subscribers1 = Collections.newSetFromMap(
     Collections.synchronizedMap(new WeakHashMap<Session, Boolean>()) 
); 
private Set<Session> subscribers2 = Collections.synchronizedSet(
     Collections.newSetFromMap(new WeakHashMap<Session, Boolean>()) 
); 

回答

0

如果你看的实现,这是几乎相同。

Collections.newSetFromMap创建一个新的SetFromMap extends AbstracSet实例。 SetFromMap类基本上是一个地图对象的包装。但它确实继承了AbstracSet中的addAll方法。这意味着,在第一个选项:

private Set<Session> subscribers1 = Collections.newSetFromMap(
     Collections.synchronizedMap(new WeakHashMap<Session, Boolean>()) 
); 

不是所有的操作都将被同步(即addAll方法 - 虽然它使用引擎盖下的同步add方法)。由于这一事实,我建议选择第二个选项:

private Set<Session> subscribers2 = Collections.synchronizedSet(
     Collections.newSetFromMap(new WeakHashMap<Session, Boolean>()) 
); 
+0

“不是所有的操作都将被同步(即'addAll'方法)” - 我不认为这是正确的,因为'AbstractCollection.addAll'循环并调用'add',它将委托给包裹地图的同步'put'方法。但是这仍然意味着对于批量方法来说,在最顶层视图中进行同步会更有效率,所以您的推荐似乎至少是正确的。 –

+0

你说得对,它调用了同步的“add”。但是'addAll'就像第二个选项一样。这就是我的意思(我没有检查addAll的实现)。无论如何,这是两种方法之间的唯一区别,至少我看不到任何其他方法。但是,很难想象这种差异会成为一个大问题的用例。 – MarcelK