54

Collections.synchronizedMap()次のコードは、並行性で正確性を維持しながら使用せずに書き直すことができますか?

Collections.synchronizedMap(new WeakHashMap<Class, Object>());

つまり、代わりに使用できるjava.util.concurrentの何かがありますか?単に置き換えることに注意してください

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));

明らかに機能しません

4

7 に答える 7

40

GuavaCacheBuilderクラスを使用すると、これを簡単に行うことができます。

CacheBuilder.newBuilder().weakKeys().build()

これにより、重要な等価セマンティクスが変更され、インスタンスを使用する場合には問題になりませんが、潜在的な落とし穴になること==に注意してください。.equals()Class

于 2010-02-13T00:38:56.953 に答える
22

あるとは思わない。実際、javadocはCollections.synchronizedMap()の使用を提案しています

「ほとんどのコレクションクラスと同様に、このクラスは同期されていません。同期されたWeakHashMapは、Collections.synchronizedMapメソッドを使用して構築できます。」

于 2010-02-13T00:34:20.580 に答える
0

WeakHashMap を同期されたマップにラップすると、ガベージ コレクターは同期されたマップ ラッパーをバイパスして、いつでも直接弱参照を変更できるため、やりたいことに対して正しく機能しますか? WeakHashMap は、シングル スレッド モデルでのみ真に機能すると思います。

前述のように、https ://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html にある WeakHashMap のドキュメントには、具体的に次のように記載されています。

「同期された WeakHashMap は、Collections.synchronizedMap メソッドを使用して構築できます」

これは、この手法がガベージ コレクターの動作と連携して機能する必要があることを意味します (ドキュメントにバグがない限り!)。

于 2017-02-17T10:23:40.633 に答える
-1

WeakHashMap を同期されたマップにラップすると、ガベージ コレクターは同期されたマップ ラッパーをバイパスして、いつでも直接弱参照を変更できるため、やりたいことが正しく機能しますか? WeakHashMap は、シングル スレッド モデルでのみ真に機能すると思います。

于 2012-03-05T19:18:08.540 に答える