2

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

1 に答える 1

0

実装を見ると、ほぼ同じです。

Collections.newSetFromMap新しいSetFromMap extends AbstracSetインスタンスを作成します。このSetFromMapクラスは基本的にマップ オブジェクトのラッパーです。ただし、addAllからメソッドを継承しAbstracSetます。これは、最初のオプションで次のことを意味します。

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

すべての操作が同期されるわけではありません (つまり、addAllメソッド - 内部では同期addメソッドを使用しますが)。このため、2 番目のオプションを選択することをお勧めします。

private Set<Session> subscribers2 = Collections.synchronizedSet(
        Collections.newSetFromMap(new WeakHashMap<Session, Boolean>())
);
于 2013-07-13T17:14:49.617 に答える