private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity);
bucket = signSafeMod(bucket, capacity);
private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
private static <V> void insertKeyValueNoLock(long[] keys, V[] values, long key, V value) { int bucket = (int) hash(key); while (true) { bucket = signSafeMod(bucket, keys.length); V storedValue = values[bucket]; if (storedValue == EmptyValue) { // The bucket is empty, so we can use it keys[bucket] = key; values[bucket] = value; return; } ++bucket; } } }
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity); V nextValueInArray = values[signSafeMod(bucket + 1, capacity)]; if (nextValueInArray == EmptyValue) { values[bucket] = (V) EmptyValue;
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity);
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity);
while (true) { int capacity = this.capacity; bucket = signSafeMod(bucket, capacity);
@Test public void testHashConflictWithDeletion() { final int Buckets = 16; ConcurrentLongHashMap<String> map = new ConcurrentLongHashMap<>(Buckets, 1); // Pick 2 keys that fall into the same bucket long key1 = 1; long key2 = 27; int bucket1 = ConcurrentLongHashMap.signSafeMod(ConcurrentLongHashMap.hash(key1), Buckets); int bucket2 = ConcurrentLongHashMap.signSafeMod(ConcurrentLongHashMap.hash(key2), Buckets); assertEquals(bucket1, bucket2); assertEquals(map.put(key1, "value-1"), null); assertEquals(map.put(key2, "value-2"), null); assertEquals(map.size(), 2); assertEquals(map.remove(key1), "value-1"); assertEquals(map.size(), 1); assertEquals(map.put(key1, "value-1-overwrite"), null); assertEquals(map.size(), 2); assertEquals(map.remove(key1), "value-1-overwrite"); assertEquals(map.size(), 1); assertEquals(map.put(key2, "value-2-overwrite"), "value-2"); assertEquals(map.get(key2), "value-2-overwrite"); assertEquals(map.size(), 1); assertEquals(map.remove(key2), "value-2-overwrite"); assertTrue(map.isEmpty()); }