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