es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

RLock#lock(long leaseTime, TimeUnit unit) – el tiempo de arrendamiento es menor que el tiempo de ejecución.

Código:

public void lock() {
    RLock lock = redissonClient.getLock("lock");
    lock.lock(1, TimeUnit.SECONDS); // o use lock.lock()
    hacerAlgo();
    lock.unlock(); // si es necesario
}

Si hacerAlgo() tarda más de 1 segundo(en caso de redes u otros motivos), entonces otro hilo podría obtener el candado, pero esto generaría problemas (como un exceso de ventas). Si se usa lock.lock() y este cliente se desconecta, nunca liberará el candado y otros clientes no podrán obtenerlo. ¿Cómo solucionar o equilibrar este problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Existen algunas soluciones para el problema de un método doSomething() de larga duración que causa problemas con el bloqueo.

    1. Aumentar el tiempo de espera del bloqueo: Una opción es aumentar el tiempo de espera pasado en lock() para que tenga una duración más larga que pueda adaptarse al retraso potencial causado por doSomething(). Sin embargo, esto puede llevar a tiempos de espera más largos para los hilos que intentan adquirir el bloqueo, especialmente si doSomething() suele tardar más que la duración de espera.
    2. Usar el método tryLock(): Una alternativa es usar el método tryLock(), que intenta adquirir el bloqueo durante una duración especificada pero devuelve inmediatamente si no se puede adquirir el bloqueo. De esta manera, si otro hilo ya tiene el bloqueo, el hilo que llama puede proceder con un comportamiento de reserva en lugar de esperar indefinidamente. Por ejemplo:

    RLock lock = redissonClient.getLock("lock");
    if (lock.tryLock(1, TimeUnit.SECONDS)) {
        try {
            doSomething();
        } finally {
            lock.unlock();
        }
    } else {
        // comportamiento de reserva si no se puede adquirir el bloqueo
    }
    
    1. Usar un mecanismo de arrendamiento: Otra estrategia es usar un mecanismo de arrendamiento que libera automáticamente el bloqueo después de un cierto período, incluso si el hilo propietario no lo libera. Redisson soporta esto a través de sus métodos leaseTime() y leaseTimeUnit(). Por ejemplo:
    RLock lock = redissonClient.getLock("lock");
    lock.lock(5, TimeUnit.SECONDS).leaseTime(10, TimeUnit.SECONDS);
    try {
        doSomething();
    } finally {
        lock.unlock();
    }
    

    En este ejemplo, el bloqueo se adquiere durante 5 segundos pero se establece un arrendamiento de 10 segundos, lo que significa que incluso si el hilo no libera el bloqueo, Redisson lo liberará automáticamente después de 10 segundos.

    En general, la elección de una solución depende del caso de uso específico y del equilibrio entre la concurrencia y la tolerancia a fallos.

Comments are closed.