LINUX.ORG.RU

Пул блокировок?

 


0

1

Задача. Дано: 100500*10¹⁰⁰ объектов идентифицируемых по некоему id. Нужно ограничить одновременный доступ к любому из объектов.

Наивное решение:

Lock locks[];

Lock lock = locks[id % locks.length];
lock.lock();
try {
// do some magic with our object 
} finally {
  lock.unlock();
}

Позволяет одновременно работать количеству потоков не больше locks.length что нас устраивает.

Какие подводные камни?

зы. да есть подобная тема (мояже) от 2009 года, но там камней так и не накидали, тем не менее в диком коде такое решение почемуто не попадалось, вот и интересно.

Deleted

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util...

Покопай сорцы, подводные камни видимо в том, как лучше вычислять индекс. Смотри метод smear, который улучшает распределение, и то, что вместо отстатка от деления используется битовая маска т.к. это быстрее.

dizza ★★★★★
()
Последнее исправление: dizza (всего исправлений: 1)
Ответ на: комментарий от backburner

Коллизия не проблема.

Или ложное срабатывание блокировки

Это как, у двух одинаковых id будет различный остаток от деления?

Deleted
()
Ответ на: комментарий от dizza

Черт, в гуаве это уже есть 8)

как лучше вычислять индекс. Смотри метод smear, который улучшает распределение, и то, что вместо отстатка от деления используется битовая маска т.к. это быстрее.

Ну у меня обычно считается отстаток от hashCode для улучшения распределения какраз таки

а так да надо просто заюзать гуаву раз оно есть

Deleted
()
Ответ на: комментарий от dizza

Черт, я зашел сюда написать про это!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.