从地图同步设置还是从同步地图设置?

时间:2013-07-13 17:03:29

标签: java collections map synchronization set

我需要一个并发弱哈希集而不使用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>())
);

1 个答案:

答案 0 :(得分:0)

如果你看一下这些实现,它的差不多

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

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