Zarządzanie wieloma blokadami
Mam następującą sytuację: jednocześnie przetwarzam żądania, które mają podany klucz. Mogę przetwarzać dowolną liczbę żądań w tym samym czasie, o ile każdy trwający klucz jest unikalny.
Jestem całkowitym debiutantem ze współbieżnością w Javie. W tym celu musi istnieć jakieś wzorzec / narzędzie / istniejące pytanie, ale nie wiem, czego szukać. Mając nadzieję, że ktoś może wskazać mi właściwy kierunek, lub skomentować to, co mam do tej pory.
Ta klasa zarządza zamkami:
class LockMap<K> {
private Map<K, Object> locks = new HashMap<>();
void acquireLock(K key) throws InterruptedException {
Object lockObj;
synchronized (locks) {
lockObj = locks.get(key);
if (lockObj == null) lockObj = new Object();
locks.put(key, lockObj);
}
synchronized (lockObj) {
lockObj.wait();
}
}
void releaseLock(K key) {
Object lockObj;
synchronized (locks) {
lockObj = locks.get(key);
locks.remove(key);
}
if (lockObj != null) {
synchronized (lockObj) {
lockObj.notify();
}
}
}
}
Następnie używam menedżera blokady w ten sposób:
// lockMap is instance of LockMap shared across all threads
void doSomething(K key) {
lockMap.acquireLock(key);
try {
// something
} finally {
lockMap.releaseLock(key);
}
}
Czy to jest właściwy sposób?