Java 从地图同步集还是从同步地图同步集?

Java 从地图同步集还是从同步地图同步集?,java,collections,map,synchronization,set,Java,Collections,Map,Synchronization,Set,我需要一个不使用番石榴集合的并发弱散列集。 哪一个是正确的? 有副作用吗 private Set<Session> subscribers1 = Collections.newSetFromMap( Collections.synchronizedMap(new WeakHashMap<Session, Boolean>()) ); private Set<Session> subscribers2 = Collections.synchron

我需要一个不使用番石榴集合的并发弱散列集。 哪一个是正确的? 有副作用吗

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

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

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

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

“并非所有操作都将同步(即
addAll
方法)”-我认为这是不对的,因为
AbstractCollection.addAll
循环并调用
add
,这将委托给包装映射的同步
put
方法。但这仍然意味着,对于批量方法,在最顶层视图进行同步将更加有效,因此您的建议似乎至少是正确的。它调用已同步的
add
,这是正确的。但是第二个选项中的
addAll
。这就是我的意思(我确实检查了addAll的实现)。无论如何,这是这两种方法之间的唯一区别,至少我看不到其他方法。然而,很难想象一个用例中这种差异会成为一个大问题。
private Set<Session> subscribers2 = Collections.synchronizedSet(
        Collections.newSetFromMap(new WeakHashMap<Session, Boolean>())
);