Class ConcurrentReferenceHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
nl.basjes.parse.useragent.utils.springframework.util.ConcurrentReferenceHashMap<K,V>
Type Parameters:
K - the key type
V - the value type
All Implemented Interfaces:
ConcurrentMap<K,V>, Map<K,V>

public class ConcurrentReferenceHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>
A {link ConcurrentHashMap} that uses {link ReferenceType#SOFT soft} or {linkplain ReferenceType#WEAK weak} references for both keys and values.

This class can be used as an alternative to Collections.synchronizedMap(new WeakHashMap<K, Reference<V>>()) in order to support better performance when accessed concurrently. This implementation follows the same design constraints as {link 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 {linkplain SoftReference soft entry references}.

Since:
3.2
Author:
Phillip Webb, Juergen Hoeller
  • Constructor Details

    • ConcurrentReferenceHashMap

      public ConcurrentReferenceHashMap(int initialCapacity)
      Create a new ConcurrentReferenceHashMap instance.
      Parameters:
      initialCapacity - the initial capacity of the map
    • ConcurrentReferenceHashMap

      public ConcurrentReferenceHashMap(int initialCapacity, float loadFactor, int concurrencyLevel, ConcurrentReferenceHashMap.ReferenceType referenceType)
      Create a new ConcurrentReferenceHashMap instance.
      Parameters:
      initialCapacity - the initial capacity of the map
      loadFactor - the load factor. When the average number of references per table exceeds this value, resize will be attempted.
      concurrencyLevel - the expected number of threads that will concurrently write to the map
      referenceType - the reference type used for entries (soft or weak)
  • Method Details

    • getLoadFactor

      protected final float getLoadFactor()
    • createReferenceManager

      protected ConcurrentReferenceHashMap<K,V>.ReferenceManager createReferenceManager()
      Factory method that returns the {link ReferenceManager}. This method will be called once for each {link Segment}.
      Returns:
      a new reference manager
    • getHash

      protected int getHash(@Nullable Object o)
      Get the hash for a given object, apply an additional hash function to reduce collisions. This implementation uses the same Wang/Jenkins algorithm as {link ConcurrentHashMap}. Subclasses can override to provide alternative hashing.
      Parameters:
      o - the object to hash (may be null)
      Returns:
      the resulting hash code
    • get

      @Nullable public V get(@Nullable Object key)
      Specified by:
      get in interface Map<K,V>
      Overrides:
      get in class AbstractMap<K,V>
    • getOrDefault

      @Nullable public V getOrDefault(@Nullable Object key, @Nullable V defaultValue)
      Specified by:
      getOrDefault in interface ConcurrentMap<K,V>
      Specified by:
      getOrDefault in interface Map<K,V>
    • containsKey

      public boolean containsKey(@Nullable Object key)
      Specified by:
      containsKey in interface Map<K,V>
      Overrides:
      containsKey in class AbstractMap<K,V>
    • getReference

      @Nullable protected final ConcurrentReferenceHashMap.Reference<K,V> getReference(@Nullable Object key, ConcurrentReferenceHashMap.Restructure restructure)
      Return a {link Reference} to the {link Entry} for the specified key, or null if not found.
      Parameters:
      key - the key (can be null)
      restructure - types of restructure allowed during this call
      Returns:
      the reference, or null if not found
    • put

      @Nullable public V put(@Nullable K key, @Nullable V value)
      Specified by:
      put in interface Map<K,V>
      Overrides:
      put in class AbstractMap<K,V>
    • putIfAbsent

      @Nullable public V putIfAbsent(@Nullable K key, @Nullable V value)
      Specified by:
      putIfAbsent in interface ConcurrentMap<K,V>
      Specified by:
      putIfAbsent in interface Map<K,V>
    • remove

      @Nullable public V remove(@Nullable Object key)
      Specified by:
      remove in interface Map<K,V>
      Overrides:
      remove in class AbstractMap<K,V>
    • remove

      public boolean remove(@Nullable Object key, @Nullable Object value)
      Specified by:
      remove in interface ConcurrentMap<K,V>
      Specified by:
      remove in interface Map<K,V>
    • replace

      public boolean replace(@Nullable K key, @Nullable V oldValue, @Nullable V newValue)
      Specified by:
      replace in interface ConcurrentMap<K,V>
      Specified by:
      replace in interface Map<K,V>
    • replace

      @Nullable public V replace(@Nullable K key, @Nullable V value)
      Specified by:
      replace in interface ConcurrentMap<K,V>
      Specified by:
      replace in interface Map<K,V>
    • clear

      public void clear()
      Specified by:
      clear in interface Map<K,V>
      Overrides:
      clear in class AbstractMap<K,V>
    • purgeUnreferencedEntries

      public void purgeUnreferencedEntries()
      Remove any entries that have been garbage collected and are no longer referenced. Under normal circumstances garbage collected entries are automatically purged as items are added or removed from the Map. This method can be used to force a purge, and is useful when the Map is read frequently but updated less often.
    • size

      public int size()
      Specified by:
      size in interface Map<K,V>
      Overrides:
      size in class AbstractMap<K,V>
    • isEmpty

      public boolean isEmpty()
      Specified by:
      isEmpty in interface Map<K,V>
      Overrides:
      isEmpty in class AbstractMap<K,V>
    • entrySet

      public Set<Map.Entry<K,V>> entrySet()
      Specified by:
      entrySet in interface Map<K,V>
      Specified by:
      entrySet in class AbstractMap<K,V>
    • calculateShift

      protected static int calculateShift(int minimumValue, int maximumValue)
      Calculate a shift value that can be used to create a power-of-two value between the specified maximum and minimum values.
      Parameters:
      minimumValue - the minimum value
      maximumValue - the maximum value
      Returns:
      the calculated shift (use 1 << shift to obtain a value)