Class WeakConcurrentMap<K,V>
java.lang.Object
java.lang.ref.ReferenceQueue<K>
io.opentelemetry.context.internal.shaded.AbstractWeakConcurrentMap<K,V,WeakConcurrentMap.LookupKey<K>>
io.opentelemetry.context.internal.shaded.WeakConcurrentMap<K,V>
- Direct Known Subclasses:
StrictContextStorage.PendingScopes,WeakConcurrentMap.WithInlinedExpunction
public class WeakConcurrentMap<K,V>
extends AbstractWeakConcurrentMap<K,V,WeakConcurrentMap.LookupKey<K>>
A thread-safe map with weak keys. Entries are based on a key's system hash code and keys are
considered equal only by reference equality. This class does not implement the
Map interface because this implementation is incompatible with the map contract. While
iterating over a map's entries, any key that has not passed iteration is referenced non-weakly.
This class has been copied as is from https://github.com/raphw/weak-lock-free/blob/ad0e5e0c04d4a31f9485bf12b89afbc9d75473b3/src/main/java/com/blogspot/mydailyjava/weaklockfree/WeakConcurrentMap.java
This class is internal and is hence not for public use. Its APIs are unstable and can change at any time.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static final classstatic classAWeakConcurrentMapwhere stale entries are removed as a side effect of interacting with this map.Nested classes/interfaces inherited from class io.opentelemetry.context.internal.shaded.AbstractWeakConcurrentMap
AbstractWeakConcurrentMap.WeakKey<K> -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final AtomicLongprivate static final ThreadLocal<WeakConcurrentMap.LookupKey<?>> Lookup keys are cached thread-locally to avoid allocations on lookups.private final booleanprivate final ThreadFields inherited from class io.opentelemetry.context.internal.shaded.AbstractWeakConcurrentMap
target -
Constructor Summary
ConstructorsConstructorDescriptionWeakConcurrentMap(boolean cleanerThread) WeakConcurrentMap(boolean cleanerThread, boolean reuseKeys) WeakConcurrentMap(boolean cleanerThread, boolean reuseKeys, ConcurrentMap<AbstractWeakConcurrentMap.WeakKey<K>, V> target) -
Method Summary
Modifier and TypeMethodDescriptionprotected WeakConcurrentMap.LookupKey<K> getLookupKey(K key) Override with care as it can cause lookup failures if done incorrectly.private static booleanisPersistentClassLoader(ClassLoader classLoader) Checks whether the providedClassLoadermay be unloaded like a web application class loader, for example.protected voidresetLookupKey(WeakConcurrentMap.LookupKey<K> lookupKey) Resets any reusable state in the lookup key.Methods inherited from class io.opentelemetry.context.internal.shaded.AbstractWeakConcurrentMap
approximateSize, clear, containsKey, defaultValue, expungeStaleEntries, get, getIfPresent, iterator, put, putIfAbsent, putIfProbablyAbsent, remove, run, toStringMethods inherited from class java.lang.ref.ReferenceQueue
poll, remove, removeMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface java.lang.Iterable
forEach, spliterator
-
Field Details
-
LOOKUP_KEY_CACHE
Lookup keys are cached thread-locally to avoid allocations on lookups. This is beneficial as the JIT unfortunately can't reliably replace theWeakConcurrentMap.LookupKeyallocation with stack allocations, even though theWeakConcurrentMap.LookupKeydoes not escape. -
ID
-
thread
-
reuseKeys
private final boolean reuseKeys
-
-
Constructor Details
-
WeakConcurrentMap
public WeakConcurrentMap(boolean cleanerThread) - Parameters:
cleanerThread-trueif a thread should be started that removes stale entries.
-
WeakConcurrentMap
public WeakConcurrentMap(boolean cleanerThread, boolean reuseKeys) - Parameters:
cleanerThread-trueif a thread should be started that removes stale entries.reuseKeys-trueif the lookup keys should be reused via aThreadLocal. Note that setting this totruemay result in class loader leaks. SeeisPersistentClassLoader(ClassLoader)for more details.
-
WeakConcurrentMap
public WeakConcurrentMap(boolean cleanerThread, boolean reuseKeys, ConcurrentMap<AbstractWeakConcurrentMap.WeakKey<K>, V> target) - Parameters:
cleanerThread-trueif a thread should be started that removes stale entries.reuseKeys-trueif the lookup keys should be reused via aThreadLocal. Note that setting this totruemay result in class loader leaks. SeeisPersistentClassLoader(ClassLoader)for more details.target- ConcurrentMap implementation that this class wraps.
-
-
Method Details
-
isPersistentClassLoader
Checks whether the providedClassLoadermay be unloaded like a web application class loader, for example.If the class loader can't be unloaded, it is safe to use
ThreadLocals and to reuse theWeakConcurrentMap.LookupKey. Otherwise, the use ofThreadLocals may lead to class loader leaks as it prevents the class loader this class is loaded by to unload.- Parameters:
classLoader- The class loader to check.- Returns:
trueif the provided class loader can be unloaded.
-
getLookupKey
Description copied from class:AbstractWeakConcurrentMapOverride with care as it can cause lookup failures if done incorrectly. The result must have the sameObject.hashCode()as the input and beequal toa weak reference of the key. When overriding this, also overrideAbstractWeakConcurrentMap.resetLookupKey(L).- Specified by:
getLookupKeyin classAbstractWeakConcurrentMap<K,V, WeakConcurrentMap.LookupKey<K>>
-
resetLookupKey
Description copied from class:AbstractWeakConcurrentMapResets any reusable state in the lookup key.- Specified by:
resetLookupKeyin classAbstractWeakConcurrentMap<K,V, WeakConcurrentMap.LookupKey<K>>
-
getCleanerThread
- Returns:
- The cleaner thread or
nullif no such thread was set.
-