package name.dhruba.kb.concurrent.striping;
public class IntrinsicStripedLockProvider {
private static final int DEFAULT_NUMBER_OF_LOCKS = 2048;
private static final int DOUG_LEA_BLACK_MAGIC_OPERAND_1 = 20;
private static final int DOUG_LEA_BLACK_MAGIC_OPERAND_2 = 12;
private static final int DOUG_LEA_BLACK_MAGIC_OPERAND_3 = 7;
private static final int DOUG_LEA_BLACK_MAGIC_OPERAND_4 = 4;
private final int numberOfLocks;
public IntrinsicStripedLockProvider() {
this(DEFAULT_NUMBER_OF_LOCKS);
}
public IntrinsicStripedLockProvider(int numberOfLocks) {
if ((numberOfLocks & (numberOfLocks - 1)) != 0) {
+ numberOfLocks);
}
if (numberOfLocks == 0) {
+ "does not have useful semantics.");
}
this.numberOfLocks = numberOfLocks;
this.
locks = new Object[numberOfLocks
]; for (int i = 0; i < numberOfLocks; i++) {
}
}
int lockNumber = selectLock(key, numberOfLocks);
return locks[lockNumber];
}
private static int selectLock
(Object key,
int numberOfLocks
) { return key == null ? 0 : hash(key) & (numberOfLocks - 1);
}
private static int hash
(Object object
) { int h = object.hashCode();
h ^= (h >>> DOUG_LEA_BLACK_MAGIC_OPERAND_1) ^ (h >>> DOUG_LEA_BLACK_MAGIC_OPERAND_2);
return h ^ (h >>> DOUG_LEA_BLACK_MAGIC_OPERAND_3) ^ (h >>> DOUG_LEA_BLACK_MAGIC_OPERAND_4);
}
}