Есть ли структура или lib в java, предназначенная для использования в качестве «хеш-таблицы для блокировок»?Java hashed lock table
Я хранил большой массив хэшей, к которым можно было обращаться несколькими потоками. Я хочу синхронизировать операцию замены в этом массиве. Блокировка самого индекса не работает, потому что я использую массив примитивов. Я не хочу хранить одинаково длинный набор объектов() из-за количества элементов, которые мне нужны. Вместо этого я хочу уменьшить размер хэширования и блокировки на основе этого.
Я выполняю замену update-replace на предыдущее значение, а не на добавление, чтобы исключить некоторые параллельные библиотеки в jdk.
Ниже моя попытка реализации:
private final Object[] locks = new Object[256];
{
for (int i = 0; i < 256; i++) {
locks[i] = new Object();
}
}
final static int p = 64;
byte[] hashTable = new byte[1 << p];
int populatedCount = 0;
public void add(String s, int i) {
int h = GetHash(s);
int hashBucket = h >>> (32 - p);
int lockHash = h & 0xFF;
int oldValue;
synchronized (locks[lockHash]) {
oldValue = this.hashTable[hashBucket];
this.hashTable[hashBucket] = (byte) Math.max(this.hashTable[hashBucket], i);
}
if (oldValue == 0) {
this.populatedCount++;
}
}
Что мне действительно нужно, это редкий одновременно примитивный массив ...
Действительно ли значение 'lockHash' находится в пределах 0-254? – initramfs
254? он будет 0-255 –
Если он колеблется до 255, ваш массив блокировок будет вызывать ArrayIndexOutOfBoundsException. – initramfs