Serie de concurrencia de JUC (3): concurrencia en las entrevistas, y me confundo cuando pregunto (un artículo sobre el hígado enojado comprende a fondo el bloqueo, y la entrevista no es pánico)

No es difícil ejecutar un programa; ¡lo difícil es qué tan lejos puede ejecutarse el programa! —— una semilla feroz

Inserte la descripción de la imagen aquí
Serie de concurrencia JUC

Serie de concurrencia JUC (1): ¿Qué? Escuché que confunde concurrencia y serie de concurrencia JUC paralela
(2): condición detallada para lograr una activación de notificación precisa

La existencia del núcleo de bloqueo es de múltiples subprocesos y concurrente, solo una comprensión profunda de los bloqueos, la entrevista de encuentro no entra en pánico, sino también para tratar los problemas de concurrencia en el trabajo práctico con el bloqueo de salario para ser arbitrario.
Inserte la descripción de la imagen aquí

1. Quién decide el orden de ejecución de varios métodos de sincronización

En circunstancias normales, el orden de ejecución de los dos subprocesos no se ejecuta secuencialmente (de arriba a abajo), sino la existencia de un bloqueo, después de utilizar el mismo bloqueo, se ejecutan en secuencia.

El candado aquí es el candado del mismo objeto, el candado del objeto de la computadora, por lo que quien sea el primero lo ejecutará primero.

Computer computer = new Computer();

1.1 Implementación de código de tipo manual

Aquí hemos escrito dos métodos (dos métodos bloqueados, es decir, método de sincronización), uno está aprendiendo, el otro está jugando.

public class Demo{
    
    
    public static void main(String[] args) {
    
    
        Computer computer = new Computer();

        new Thread(()->{
    
    
            computer.study();
        },"a").start();

        try {
    
    
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        new Thread(()->{
    
    
            computer.game();
        },"b").start();
    }
}
class Computer{
    
    

    public synchronized void study(){
    
    
        try {
    
    
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("学习");
    }
    public synchronized void game(){
    
    
        System.out.println("打游戏");
    }
}

resultado de la operación

Puede ver quién está al frente y quién ejecutará primero, por lo que la orden también es aprender primero y luego jugar.

Inserte la descripción de la imagen aquí

En segundo lugar, el método de sincronización en varios objetos.

El orden de ejecución de los métodos de sincronización para bloqueos de objetos múltiples sigue siendo el mismo, pero a diferencia de un bloqueo de objetos, los bloqueos de objetos múltiples afectarán el orden de ejecución debido al tiempo de inactividad.

2.1 Implementación del código de golpe manual

En el código anterior, solo bloqueamos un objeto, luego agregamos otro bloqueo de objeto, dos objetos y los mismos dos métodos. ¿Responderías que primero aprendes y luego juegas?

public class Demo{
    
    
    public static void main(String[] args) {
    
    
        Computer computer1 = new Computer();
        Computer computer2 = new Computer();

        new Thread(()->{
    
    
            computer1.study();
        },"a").start();

        try {
    
    
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        new Thread(()->{
    
    
            computer2.game();
        },"b").start();


    }
}
class Computer{
    
    

    public synchronized void study(){
    
    
        try {
    
    
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("学习");
    }
    public synchronized void game(){
    
    
        System.out.println("打游戏");
    }
}

resultado de la operación

La respuesta correcta es: primero juegue y luego aprenda.

Inserte la descripción de la imagen aquí

Tres. Métodos sincrónicos y no sincrónicos

La diferencia entre el método sincrónico y el método asincrónico es que el método asincrónico no se ve afectado por el bloqueo.

3.1 Implementación de código hecho a mano

En el código 1.1 anterior, hemos agregado un método asincrónico (método ordinario) para ver películas, podemos verificar el orden de ejecución.

 public void movie(){
    
    
        System.out.println("看电影");
    }
public class Demo{
    
    
    public static void main(String[] args) {
    
    
        Computer computer = new Computer();

        new Thread(()->{
    
    
            computer.study();
        },"a").start();

        try {
    
    
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        new Thread(()->{
    
    
            computer.game();
        },"b").start();

        new Thread(()->{
    
    
            computer.movie();
        },"c").start();
    }
}
class Computer{
    
    

    public synchronized void study(){
    
    
        try {
    
    
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("学习");
    }
    public synchronized void game(){
    
    
        System.out.println("打游戏");
    }

    public void movie(){
    
    
        System.out.println("看电影");
    }
}

resultado de la operación
Inserte la descripción de la imagen aquí

Cuatro, método de sincronización estática

En el artículo anterior hablamos de las clases internas de Java de forma sencilla. Hablamos de que static es el primero en ejecutarse, y se llamará automáticamente cuando se cargue el bytecode, y antes del método main main, es anterior al método de construcción. En este momento, las propiedades y métodos no estáticos aún no están disponibles. Completa la inicialización.

Comprensión en profundidad ultra detallada de las clases internas de Java

El método estático está disponible tan pronto como se carga la clase, por lo que la clase bloqueada en sí es el mismo objeto.

4.1 Implementación de código de tipo manual

Seguimos creando dos bloqueos de objetos, pero la diferencia es que nuestros métodos han agregado static para convertirse en métodos estáticos, veamos el orden de ejecución.

public class Demo{
    
    
    public static void main(String[] args) {
    
    
        Computer computer = new Computer();

        new Thread(()->{
    
    
            computer.study();
        },"a").start();

        try {
    
    
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        new Thread(()->{
    
    
            computer.game();
        },"b").start();
    }
}
class Computer{
    
    

    public static synchronized void study(){
    
    
        try {
    
    
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("学习");
    }
    public static synchronized void game(){
    
    
        System.out.println("打游戏");
    }
}

resultado de la operación

Inserte la descripción de la imagen aquí

5. Comparación del método de sincronización estática y el método de sincronización ordinario

Si comprende el método de sincronización estático anterior, creo que también comprende la diferencia entre el método de sincronización estática y el método de sincronización ordinario.

El método de sincronización estática estática bloquea la clase de clase, mientras que el método de sincronización normal bloquea la llamada, por lo que son dos bloqueos diferentes.

Después de comprender este pasaje, también comprenderá el código y el resultado de salida.

5.1 Implementación del código manual

El siguiente código también crea un objeto, o dos métodos, la diferencia es que el aprendizaje de salida es un método de sincronización estático, mientras que el juego de salida es un método normal, si puede entender

public class Demo{
    
    
    public static void main(String[] args) {
    
    
        Computer computer = new Computer();
        new Thread(()->{
    
    
            computer.study();
        },"a").start();

        try {
    
    
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        new Thread(()->{
    
    
            computer.game();
        },"b").start();
    }
}
class Computer{
    
    

    public static synchronized void study(){
    
    
        try {
    
    
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println("学习");
    }
    public synchronized void game(){
    
    
        System.out.println("打游戏");
    }
}

resultado de la operación

Puede ver que el método de sincronización estática y el método de sincronización ordinario son dos bloqueos diferentes. Si no hay suspensión, el método de sincronización estática se ejecuta primero, porque se llama cuando se carga la clase (cosas importantes, innumerables veces), pero Sin embargo, en el caso del retraso de suspensión, nuestro método ordinario se ejecuta primero debido al retraso;
Inserte la descripción de la imagen aquí
recuerde que el método de sincronización estática y el método ordinario no son el mismo bloqueo, el primero es la clase y el segundo es el llamador.

Seis, finalmente

Al final, para una mejor experiencia de lectura, pongo todo lo que quiero decir a continuación, jeje.

Soy semilla de decisiones basadas en mi voluntad, en serio compartir lo que escribí en el blog ha sido el mismo credo.
Si puedes leer esta entrada del blog, significa que todavía estamos muy destinados; espero que te pueda traer algo de ayuda, la creación no es fácil,
quita el conocimiento de mi artículo, tus tres seguidos dejan, me gusta, comenta, sigue , Es mi mayor motivación.

Supongo que te gusta

Origin blog.csdn.net/A_hxy/article/details/108680962
Recomendado
Clasificación