Предположим, у меня есть несколько строковых значений (динамически генерируемых) и пул потоков, и я хочу, чтобы каждое строковое значение в любой момент времени принадлежало не более чем одному потоку. Так, например, если строка "foo" заблокирована потоком
T1 в какой-то период времени, все остальные потоки ожидают обработки "foo" (или любой другой строки, равной в "foo" с точки зрения Object.equals()) должен дождаться, пока поток
T1 снимет блокировку.
Поэтому я хочу реализовать следующий интерфейс:
Код: Выделить всё
interface Lock {
void lock(@NonNull String key);
void unlock(@NonNull String key);
}
Как я уже сказал, любой поток, входящий в метод lock(String), должен ждать (или ждать с прерыванием, или ждать с тайм-аутом), если ключ уже заблокирован какой-то другой поток.
И метод unlock(String) должен эффективно разблокировать ключ, выдавая исключение в двух случаях:
- При попытке разблокировать ключ, который не заблокирован
- При попытке разблокировать ключ, заблокированный каким-то другим потоком (не текущим).
Видимо, при реализации вышеуказанного интерфейса мне приходится связать экземпляр ReentrantLock с любым ключом, который вот-вот заблокируется, на все время, пока он остается заблокировано.
Как реализовать Интерфейс LockByKey? Какие примитивы параллелизма из пакета java.util.concurrent наиболее подходят для этой задачи?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... que-values