Comprensión profunda del estado del hilo de bloqueo de programación concurrente

Debido a que el LockSupport puede ver el hilo en el estado bloqueado, pensado por un momento que no hay manera de hacer que el hilo en el estado bloqueado? Porque no puedo conseguir la memoria sólo cuando la cerradura entrará en el estado bloqueado
pareció un poco-hilo de disparo en el bloqueado El método en
Internet dice esto:
(1) Thread sleep: método Thread.sleep (long millis) para hacer que el hilo pase a un estado bloqueado.

(2) Subproceso en espera: método wait () en la clase Object,

(3) Cortesía de hilo, método Thread.yield ()

(4) Método de cierre automático de roscas, join (),

(5) Los métodos suspend () y resume () El
método anterior puede bloquear el subproceso, pero creo que solo cuando se ingresa el estado de bloqueo puede bloquearse el subproceso. Puede ser que soy demasiado incómodo. Creo que esta declaración es un poco sesgada. , Porque recuerdo la siguiente imagen en mi mente: ¿
Inserte la descripción de la imagen aquí
pero es posible que el libro esté equivocado?
Entonces inténtalo

Método 1.sleep ()

 public static void main(String[] args) {
        new Thread(()->{
            try {
                System.out.println("正在睡眠");
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1").start();
    }

Use jps para ver el hilo
Inserte la descripción de la imagen aquí
Use jstack para ver el estado del hilo:
Inserte la descripción de la imagen aquí
Oh, TimeWaiting, el hilo está en un estado de espera de tiempo de espera

2. El método de espera

    Object o = new Object();
        Thread t2 = new Thread(() -> {
            synchronized (o) {
                try {
                    System.out.println("执行等待!");
                    o.wait();
                } catch (InterruptedException e) {

                }
            }
        }, "t2");
        t2.start();

        Thread.sleep(100000);
        o.notify();

Inserte la descripción de la imagen aquí
estado de espera

3.synchronized (estado bloqueado)

 Object o = new Object();
        new Thread(() -> {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o) {
            }
        }, "t1").start();
        //让t2 先拿到锁,然后就一直处于wait状态,我们再来观察t1
        new Thread(() -> {
            synchronized (o) {
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "t2").start();

Inserte la descripción de la imagen aquí

4. unirse

  Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "t1");
        t1.start();
        //先让t1 跑起来 观察t2
        Thread.sleep(10);
        Thread t2 = new Thread(() -> {
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }, "t2");
        t2.start();

Inserte la descripción de la imagen aquí

5 rendimiento

El método de renunciar al intervalo de tiempo de la CPU es un poco difícil de operar, porque es demasiado corto para renunciar a un intervalo de tiempo

Pensaré en una forma de actualizar más tarde

6.Soporte de bloqueo

Inserte la descripción de la imagen aquí

    Thread t1 = new Thread(() -> {
            LockSupport.park();
        }, "t1");
        t1.start();
        Thread.sleep(100000);
        LockSupport.unpark(t1);

Inserte la descripción de la imagen aquí

Conclusión: el
último LockSupport puede derrocar a todos los anteriores: solo ingresar al estado de bloqueo se puede llamar un hilo de bloqueo

Quizás esta parte no está específicamente definida, por lo que no necesita profundizar en ella, solo necesita comprenderla y no debe usar esta parte del conocimiento en el desarrollo diario.

Y si desea bloquear el hilo: todo lo
anterior, excepto el rendimiento, puede desempeñar el papel de bloquear el hilo, en lugar de permitir que el hilo entre en el estado de hilo de bloqueo definido por java

Publicado 37 artículos originales · elogiado 6 · visitas 4632

Supongo que te gusta

Origin blog.csdn.net/littlewhitevg/article/details/105598192
Recomendado
Clasificación