已从映射中同步设置或从已同步映射中设置



我需要一个不使用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>())
);

最新更新