问题
How do I get a ConcurrentHashMap
with weak keys and identity hashes in Java? I think Google Guava Collections can give such a thing, but can I get it from the standard library? What other options do I have?
回答1:
I think Google Guava Collections can give such a thing, but can I get it from the standard library?
The short answer to that is No. Java SE does not implement this particular combination.
You could instantiate a
java.util.concurrent.ConcurrentHashMap
withWeakReference
keys, and do some extra work to implement removal of map entries for broken references, but that won't give you identity hash semantics.You could instantiate a
java.util.IdentityHashMap
withWeakReference
keys, and do some extra work to implement removal of map entries for broken references, but that won't give you concurrent behaviour.Using a
java.util.WeakHashMap
won't give you either concurrency or identity hashing.You could (in theory) wrap the key class in something that overrode the natural
equals
andhashcode
methods. But that is most likely to be unusable.I don't think it would be possible to do this by overriding methods in either
ConcurrentHashMap
orIdentityHashMap
.
Maybe the only viable option would be to change the key classes equals
and hashcode
methods to be identity based. But that won't work for "built in" key types (especially final
ones) or for cases where you need value-based equals/hashcode in other parts of the application.
回答2:
The Google Guava implementation appears the easiest way to go. One may initialize the required map with new MapMaker().weakKeys().makeMap()
and use just as one would use java.util.concurrent.ConcurrentHashMap
. See the apidoc for more details.
回答3:
if your application is under spring framework ( version is gt 3.2 ), you can consider to use org.springframework.util.ConcurrentReferenceHashMap
. Below is its description:
A ConcurrentHashMap that uses soft or weak references for both keys and values. This class can be used as an alternative to Collections.synchronizedMap(new WeakHashMap>()) in order to support better performance when accessed concurrently. This implementation follows the same design constraints as ConcurrentHashMap with the exception that null values and null keys are supported.
NOTE: The use of references means that there is no guarantee that items placed into the map will be subsequently available. The garbage collector may discard references at any time, so it may appear that an unknown thread is silently removing entries.
If not explicitly specified, this implementation will use soft entry references.
回答4:
search ConcurrentWeakIdentityHashMap, you will get many examples. I wrote an implement myself, for I think the hashCode of org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap$WeakReference is so bad.
Example of ehcache3
Example I wrote
Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode
来源:https://stackoverflow.com/questions/15456742/concurrenthashmap-with-weak-keys-and-identity-hash