day106-caché-bloqueo distribuido-Redisson-reentrant lock introducción y prueba de bloqueo de bloqueo

1. Introducción a las cerraduras reentrantes 

¿Qué es una cerradura reentrante, por ejemplo?

Ahora tengo un bloqueo de objeto de bloqueo, en la llamada al método A, está bloqueado con bloqueo

Después del bloqueo, hay una llamada al método B en el método A, y el método B se bloquea con bloqueo.

Si no es un bloqueo reentrante, se interbloqueará al llamar al método B, porque el bloqueo de bloqueo en el método A aún no se liberará.

Si se trata de un bloqueo reentrante, puede ejecutar directamente el método B, debe comprender esto, una vez que se adquiere un bloqueo en el mismo hilo, entonces

La ejecución posterior del hilo también necesita este bloqueo, por lo que puede usarlo directamente

Desea obtener más información sobre la referencia: https://blog.csdn.net/yanyan19880509/article/details/52345422 , y luego vaya a ver el código fuente relevante usted mismo

Excepto sincronizar y ReentrantLock y las subclases, los demás no son reentrantes. Por supuesto, con la ayuda de AQS, puede implementar el bloqueo de reingreso usted mismo

2.prueba de bloqueo de bloqueo

Agregue el código en IndexController de la siguiente manera

    @RequestMapping({"/hello"})
    @ResponseBody
    public String hello(){

        //获取一把锁,只要名称一样就是同一把锁
        RLock lock = redissonClient.getLock("my-lock");
        //加锁 没加上锁的线程阻塞式等待,不用我们之前那样写的自旋
        lock.lock();
        //模拟业务执行
        System.out.println("加锁成功,业务执行中,执行线程为:"+Thread.currentThread().getId());
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //释放锁
            System.out.println("释放锁,执行线程为:"+Thread.currentThread().getId());
            lock.unlock();
        }

        return "hello";
    }

 

El navegador abre dos ventanas al mismo tiempo para acceder a este método

El navegador muestra lo siguiente. Puede ver que un subproceso adquiere el bloqueo, ejecuta el negocio y luego lo libera, y luego otro subproceso hace la misma operación. El subproceso que no ha adquirido el bloqueo se bloqueará y esperará hasta que el bloqueo sea publicado.

Lo anterior vio las funciones básicas de la cerradura, como dijimos en el apartado anterior, no se libera el tiempo de inactividad repentino o el bloqueo por falla de energía, o se adquiere el bloqueo, se desbloquea el problema de atomicidad, etc.

¿Reddison tiene una solución? Una prueba simple

Ahora estoy probando el problema de un subproceso que se bloquea cuando se agrega el bloqueo y el bloqueo se libera antes de que se libere el bloqueo. Si el bloqueo no se libera después del bloqueo, naturalmente se interbloqueará.

Copie la configuración de la aplicación y comience después de cambiar el puerto

Visita después de iniciar dos servicios

En este momento, el servicio se detiene después de que se adquiere el bloqueo en el servicio en el puerto 10201

Al ver que el bloqueo en el servicio 10200 aún se puede adquirir, el negocio se ejecuta como de costumbre y se libera el bloqueo.

Explique que el bloqueo se libera después del tiempo de inactividad. Se supone que debe haber un tiempo de vencimiento predeterminado, por lo que el bloqueo se liberará después de que se detenga el servicio. Más que eso, creo

La atomicidad de adquirir cerraduras y operaciones de desbloqueo también se implementa en la parte inferior de la cerradura. Si la empresa permite mucho tiempo, no hay necesidad de preocuparse por la liberación automática de la cerradura antes de que la empresa se ejecute. Durante la operación comercial, hay Será renovación automática cada diez segundos.

La siguiente sección lo lleva a ver cómo se implementa el código subyacente

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/JavaCoder_juejue/article/details/113794564
Recomendado
Clasificación