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>())
);
4

1 回答 1

0

如果你看一下实现,它几乎是一样的。

Collections.newSetFromMap创建一个新SetFromMap extends AbstracSet实例。该类SetFromMap基本上是地图对象的包装器。但它确实addAllAbstracSet. 这意味着在第一个选项中:

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>())
);
于 2013-07-13T17:14:49.617 回答