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 +}