diff --git a/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java b/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java index ce4ec6d..11c0142 100644 --- a/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java +++ b/src/main/java/org/cliffc/high_scale_lib/NonBlockingHashMap.java @@ -667,7 +667,7 @@ private static final Object putIfMatch( final NonBlockingHashMap topmap, final O (expVal != MATCH_ANY || V == TOMBSTONE || V == null) && !(V==null && expVal == TOMBSTONE) && // Match on null/TOMBSTONE combo (expVal == null || !expVal.equals(V)) ) // Expensive equals check at the last - return V; // Do not update! + return (V==null && expVal!=null) ? TOMBSTONE : V; // Do not update! // Actually change the Value in the Key,Value pair if( CAS_val(kvs, idx, V, putval ) ) { diff --git a/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java b/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java index 045b62a..97c4b88 100644 --- a/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java +++ b/src/test/java/org/cliffc/high_scale_lib/NonBlockingHashMapTest.java @@ -36,6 +36,7 @@ public boolean equals( Object o ) { // Test some basic stuff; add a few keys, remove a few keys public void testBasic() { assertTrue ( _nbhm.isEmpty() ); + assertThat ( _nbhm.replace("k0","v0"), nullValue() ); assertThat ( _nbhm.putIfAbsent("k1","v1"), nullValue() ); checkSizes (1); assertThat ( _nbhm.putIfAbsent("k2","v2"), nullValue() );