Resumen de conceptos básicos de Java (ochenta y ocho): sincronizado también es reentrante

Enlace original ,

Las cerraduras de reentrada, literalmente entendidas, son cerraduras que se pueden volver a ingresar.

Los bloqueos reentrantes, también llamados bloqueos recursivos, significan que después de que la función externa del mismo hilo adquiere el bloqueo, la función recursiva interna todavía tiene el código para adquirir el bloqueo, pero no se ve afectada.

En el entorno JAVA ReentrantLocky synchronizedson bloqueos reentrantes.

synchronizedEs una cerradura reentrante. En una clase, si el método sincronizado 1 llama al método sincronizado 2, el método 2 se puede ejecutar normalmente, lo que muestra que sincronizado es un bloqueo reentrante. De lo contrario, cuando el método 2 quiera adquirir un bloqueo, el bloqueo ya se ha adquirido cuando se ejecuta el método 1, entonces el método 2 nunca se ejecutará.

¿En qué escenarios se deben utilizar las cerraduras reentrantes?

Los bloqueos reentrantes se utilizan principalmente cuando los subprocesos necesitan ingresar el código de la sección crítica varias veces y se requieren bloqueos reentrantes. Ejemplos específicos, como cuando un método sincronizado mencionado anteriormente necesita llamar a otro método sincronizado.

¿Cuál es el principio de implementación de las cerraduras reentrantes?

Al bloquear, debe determinar si se ha adquirido el bloqueo. Si se ha adquirido, se determina si el hilo que adquirió el bloqueo es el hilo actual. Si es el hilo actual, agregue 1 al número de adquisiciones. Si no es el hilo actual, debe esperar.

Al liberar el bloqueo, debe restar 1 del número de adquisiciones de bloqueo y luego determinar si el número de veces es 0. Si el número de veces es 0, debe llamar al método de activación del bloqueo para permitir que otros subprocesos bloqueados en el bloqueo tengan la oportunidad de ejecutarse.

El siguiente es un ejemplo implementado con sincronizado:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

public class ReentrantTest implements Runnable {

  public synchronized void get() {

    System.out.println(Thread.currentThread().getName());

    set();

  }

  public synchronized void set() {

    System.out.println(Thread.currentThread().getName());

  }

  public void run() {

    get();

  }

  public static void main(String[] args) {

    ReentrantTest rt = new ReentrantTest();

    for(;;){

      new Thread(rt).start();

    }

  }

}

No hay un punto muerto en todo el proceso y algunos de los resultados de salida son los siguientes:

Hilo-8492
Hilo-8492
Hilo-8494
Hilo-8494
Hilo-8495
Hilo-8495
Hilo-8493
Hilo-8493

set()Y get()al mismo tiempo, muestra el nombre del hilo, lo que indica que no synchronizedhay interbloqueo incluso si se usa de forma recursiva , lo que demuestra que es reentrante.

para resumir

Lo anterior es el contenido completo de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para su estudio o trabajo. Gracias por su apoyo a Scripthome. Si desea obtener más información al respecto, consulte los enlaces relacionados a continuación.

Supongo que te gusta

Origin blog.csdn.net/lsx2017/article/details/113922446
Recomendado
Clasificación