WeakHashMap用java.util.concurrentの相当するものはありますか?
-
20-09-2019 - |
質問
次のコードは、まだCollections.synchronizedMap()
を使用して並行性で正確さを維持するO / W書き換えることができますか?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
すなわち。代わりに使用することができますjava.util.concurrentの1から何かはありますか?単に
と置き換えることに注意してくださいnew ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
は明らかに動作しません。
解決
グアバするの<のhref = "https://google.github.io/guava /releases/23.0/api/docs/com/google/common/cache/CacheBuilder.html」のrel = "nofollowをnoreferrer"> CacheBuilder のクラスを使用すると、簡単にこれを行うことができます。
CacheBuilder.newBuilder().weakKeys().build()
これは==
インスタンスを使用して、あなたの場合には関係なく、潜在的な落とし穴ではありません代わりに.equals()
のClass
するキー平等の意味を変更することに注意してください。
他のヒント
私はそこにあるとは思いません。実際には、JavadocはCollections.synchronizedMap()
を使用することを提案します「ほとんどのコレクションクラスと同様に、このクラスが同期されません。同期のWeakHashMapはCollections.synchronizedMapメソッドを使って作成でき。」
Cafeine のグアバキャッシュの人気のライバルです。
- keys automatically wrapped in weak references
- values automatically wrapped in weak or soft references
使用方法:
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
.weakKeys()
.weakValues()
.build(key -> createExpensiveGraph(key));
は、まだ動作し、同期マップ内のWeakHashMapを包むん 正しくあなたが何をしたいのかについて、ガベージコレクタができるので、 バイパスして、いつでも直接weakreferencesを変更 同期マップラッパー?私は、WeakHashMapには、唯一の真にうまくいくと思います シングルスレッドモデルます。
上述したように、でのWeakHashMapのドキュメントhttps://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html に特に言います:
"同期のWeakHashMapを使用して構築することができます Collections.synchronizedMapメソッド」
この手法は、ガベージコレクタの動作と連携して動作しなければならないことを私に暗示(ドキュメントがバギーでない限り!)
は、Java 7を使用して上記されている場合は、このユースケースは、<ClassValue
で、スレッドセーフな方法で解決されるのhref = "https://docs.oracle.com/javase/7/docs/api/java/ LANG / ClassValue.html」のrel = "nofollowをnoreferrer"> https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html のあなたがremove
の使用が必要な場合に、同時性について慎重に検討し、徹底的にドキュメントを読みます。
あなたは以下のJava 6以上を使用している場合。いいえ、あなたはのWeakHashMapを同期化する必要があります。
は、ガベージコレクタが同期マップラッパーをバイパスして、いつでも直接weakreferencesを変更することができますので、まだ、あなたがやりたいことのために正常に動作し、同期マップ内のWeakHashMapをラップしていますか?私は、WeakHashMapには、唯一の真シングルスレッドモデルではうまくいくと思う。