Проектирование блокировки на основе ключа (или карты блокировки)

Я пытаюсь разработать средство блокировки на основе ключей: что-то вроде обычной входящей блокировки, но вместо lock () и unlock () вы блокируете (ключ) и разблокируете (ключ) с контрактом, которого никто не будет быть в состоянии заблокировать (key1) одновременно, если key.equals (key1).

Будет ли этот код работать? Есть ли более эффективные решения? Мне особенно не нравится цикл while при попытке установить блокировку на карте ...

package luca;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.locks.ReentrantLock;

public class KeyedReentrantLock<K> {
    private ConcurrentMap<K, ReentrantLock> lockMap = new ConcurrentHashMap<K, ReentrantLock>();

    public void lock(K key) {
        ReentrantLock oldLock = lockMap.get(key);
        if (oldLock != null && oldLock.isHeldByCurrentThread()){
            // increase lock count and return.
            oldLock.lock();
            return;
        }
        ReentrantLock newLock = new ReentrantLock();
        newLock.lock();
        while ((oldLock = lockMap.putIfAbsent(key, newLock)) != null){
            // wait for the old lock to be released;
            oldLock.lock();
            oldLock.unlock();
        }
        return;
    }

    public void unlock(K key){
        ReentrantLock lock = lockMap.get(key);
        if (lock == null) throw new IllegalMonitorStateException("There was no lock for this key!");
        if (lock.getHoldCount() == 1){
            lockMap.remove(key);
        }
        lock.unlock();
    }

}

Ответы на вопрос(4)

Ваш ответ на вопрос