diff --git a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java index a0b2782..7f4b4a9 100644 --- a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java +++ b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java @@ -166,13 +166,35 @@ protected V defaultValue(K key) { return null; } + /** + * Removes the value corresponding to the already garbage collected {@link Reference}. This + * should generally only be used if overriding {@link #expungeStaleEntries()} to execute code + * when references have been collected. + * + *
{@code
+ * class MyReferenceListener extends WeakConcurrentMap.WithInlinedExpunction {
+ * public void expungeStaleEntries() {
+ * Reference> reference;
+ * while ((reference = poll()) != null) {
+ * V value = expungeStaleEntry(reference);
+ * if (value != null) {
+ * reportOrphanedReference(value);
+ * }
+ * }
+ * }
+ * }
+ */
+ protected final V expungeStaleEntry(Reference> reference) {
+ return target.remove(reference);
+ }
+
/**
* Cleans all unused references.
*/
public void expungeStaleEntries() {
Reference> reference;
while ((reference = poll()) != null) {
- target.remove(reference);
+ expungeStaleEntry(reference);
}
}
@@ -189,7 +211,7 @@ public int approximateSize() {
public void run() {
try {
while (!Thread.interrupted()) {
- target.remove(remove());
+ expungeStaleEntry(remove());
}
} catch (InterruptedException ignored) {
// do nothing
@@ -344,4 +366,4 @@ public V setValue(V value) {
return entry.setValue(value);
}
}
-}
\ No newline at end of file
+}