public boolean putIfAbsent(K key, V value) {
long hashCode = hashCode(key);
long currentPtr = bucketFor(hashCode);
RWLock lock = lockFor(hashCode).lockWrite();
try {
for (long entry; (entry = unsafe.getAddress(currentPtr)) != 0; currentPtr = entry + NEXT_OFFSET) {
if (unsafe.getLong(entry + HASH_OFFSET) == hashCode && equalsAt(entry, key)) {
return false;
}
}
long entry = allocateEntry(key, hashCode, sizeOf(value));
unsafe.putLong(entry + HASH_OFFSET, hashCode);
unsafe.putAddress(entry + NEXT_OFFSET, 0);
setTimeAt(entry);
setValueAt(entry, value);
unsafe.putAddress(currentPtr, entry);
} finally {
lock.unlockWrite();
}
count.incrementAndGet();
return true;
}