我需要一个不使用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>())
);
如果您查看实现,它几乎是相同的。
CCD_ 1创建一个新的CCD_。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>())
);