Diseño de un bloqueo basado en clave (o mapa de bloqueo)

Estoy tratando de diseñar una instalación de bloqueo basada en teclas: algo así como un bloqueo reentrante normal, pero en lugar de bloquear () y desbloquear (), usted bloquea (clave) y desbloquea (clave), con el contrato de que nadie podrá bloquear (clave1) simultáneamente si key.equals (clave1).

¿Funcionará este código? ¿Hay soluciones más eficientes? Particularmente no me gusta el bucle while mientras trato de poner el candado en el mapa ...

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();
    }

}

Respuestas a la pregunta(8)

Su respuesta a la pregunta