Una ilustración minuto del estancamiento hebra Java - viajes tormenta entre marido y mujer

Para entender mejor el punto muerto, el lector puede necesitar saber acerca de los conocimientos relacionados con la seguridad hilo, sobre todo hay una cierta comprensión de la situación de los seis hilos de ejecución, especialmente en estado de bloqueo, que es la clave para un interbloqueo. Y sólo la comprensión en profundidad del estancamiento del proceso. Aquí adjunto antes de una cuota de la lectura de un enlace, por supuesto, puede omitir. También puede leer este artículo Tipo de historia.

Seis ejecución roscado por el estado

Aquí Insertar imagen Descripción


En primer lugar, la historia introdujo

 Hay un par, tener un coche (cuando sea posible Rolls Royce); mientras que dos acuerdo prenupcial, sólo que con un bolso (por favor conflicto no pago electrónico, no lo hacen), y sólo se puede realizar por uno ;
 Un día, su marido se preparaba para ir a cenar con amigos, es necesario tomar las llaves del coche y la cartera, su esposa quería ir de compras, quizás llevar las llaves y la cartera;
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
analogía de la siguiente manera:
Aquí Insertar imagen Descripción

Cada objeto tiene una etiqueta de bloqueo mutex, asignado a la rosca. Sólo con objetos mutex marcados hilo para entrar en el bloque de código sincronizado ese objeto bloqueado. Hilo libera el mutex marca de bloque de sincronización de salida correspondiente.

 Tanto el marido como la esposa tienen sus propias cosas que hacer, el proceso es análogo a ejecutar dos hilos; tanto necesidad de ser completada si usted quiere hacer, debe conseguir las llaves del coche y la cartera, la analogía aquí se accede por múltiples hilos recursos críticos, y cada objeto de recurso crítico tiene una y sólo una token de bloqueo, sólo aquellos con marca de bloqueo de rosca antes de que puedan tener el objeto;

  •  Escenario uno: el marido va a buscar las llaves del coche y la cartera hecho su propia cosa, y luego poner las llaves y la cartera coche de vuelta a su esposa;

Analogía: dos hilos, hilo de un segmento de tiempo asignado primero para obtener el sistema operativo, y luego visitan dos objetos recurso crítico y con éxito consiguió dos números cerraduras, y una porción de tiempo no ha expirado antes de que todo está terminado, a continuación, suelte la marca de bloqueo el hilo 2 y luego continuar;

  •  Escenario 2: el marido va a buscar la cartera, pero esta vez de repente quiere ir al baño, pero en este momento, a su esposa para ir de compras, las llaves del coche de distancia, pero después de que el coche salió y encontró ningún cartera, por lo que espera para el retorno de la bolsa; marido después de ir al baño y encontraron las llaves del coche han ido, por lo tanto, esperar a que las llaves del coche en el hogar, dos personas sin fin y así sucesivamente. (Se podría decir, hacer una llamada telefónica para pedir ah! No se preocupe, no luchar)

Analogía: Tema 1 primero consiguió la distribución OS intervalo de tiempo, y el acceso a la bolsa objeto de recurso crítico, pero la marca de bloqueo para conseguir el objeto, dispuesto a tomar el tiempo para marcas de bloqueo de otro objeto recurso crítico, el intervalo de tiempo expira, porque en un plazo de estado de espera. Para la fecha límite periodo hilo 1 y esperando, hilo 2 y obtenga una distribución del sistema operativo intervalo de tiempo, y consiguió la marca de bloqueo un coche objeto recurso crítico, porque no ha encontrado la etiqueta de bloqueo de objeto de la cartera, por lo que entrar en el estado bloqueado, esperando a que los otros lanzamientos de rosca la marca de bloqueo ; 1 hilo plazo este tiempo de espera para el final, y una vez más obtener el intervalo de tiempo asignado OS, no puede conseguir el coche marcado bloqueo debido a que el objeto, y por lo tanto en un estado de bloqueo, dos hilos se ven atrapadas en un estado bloqueado.

En segundo lugar, estancamiento

Aquí Insertar imagen Descripción

 Obviamente, los dos hilos de cada cerradura para obtener una etiqueta de objeto recurso crítico, y son la espera estado bloqueado el uno al otro para lanzar una marca de bloqueo, cada marca no están dispuestos a liberar el bloqueo, debido a una indefinida en un punto muerto, esto es un callejón sin salida;

generación de estancamiento

  • Cuando el objeto una primera rosca posee el indicador de bloqueo, con la etiqueta B y esperar a que un objeto de bloqueo, mientras que el objeto B tiene el segundo indicador de bloqueo de rosca, y espera Una cerradura objeto marcador, punto muerto.
  • Un hilo puede tener múltiples objetos simultáneamente bloqueo de modo, cuando el hilo se bloquea, no liberará la marca de bloqueo ya tienen, que puede resultar en un punto muerto.

En tercer lugar, la comunicación entre hilos

 Cuando una cosa muy normal cuando una disputa entre marido y mujer, pero no podría haber sido un punto muerto, el estancamiento se verá atrapado en un "callejón sin salida", deben completarse con el fin de resolver el problema de comunicación, por lo tanto, las dos partes se necesitan mutuamente para hacer las cosas que quiere hacer , va a negociar, se puede poner la cartera a su mujer, la dejó ir de compras, después de que su esposa hacer sus cosas y luego las llaves del coche a su marido, y luego de resolver el problema, que requiere una "comunicación".

  •  Escenario 3: Cuando los dos hombres en un punto muerto entre sí, finalmente tuvo una comunicación telefónica, los resultados finales de la consulta a que su mujer de compras ir, su marido en casa a esperar hasta que su esposa llegó a casa de compras, las llaves del coche y la cartera a pagar y notificar a su marido. Si la esposa terminó la ejecución de sus propios asuntos directamente a las teclas de la cartera y el coche nuevo en su lugar, pero no informó a su marido, el marido había regresado todavía no conoce su esposa, seguirá cayendo en el estado bloqueado, sólo la esposa personalmente entregó las llaves de la cartera y del coche su marido, el marido puede hacer su propia cosa, o billetera esposa y teclas de nuevo en su lugar, dejar que la niñera o alguien más está llevando a cabo para notificar a su marido antes de que pueda.

Analogía: Tema 1 se llevará a cabo por él mismo y un objeto recurso crítico (la bolsa objeto) Marca de bloqueo utilizado para la llamada obj.wait()después del lanzamiento de su entrada en la cola, pero esta vez, para obtener un bloqueo porque el hilo 2 etiquetas hilo 1, y por lo tanto entrar en la lista estado comenzó. Cuando el hilo 2 está terminado, la marca de bloqueo - libere objeto recurso crítico, pero esta vez porque el hilo 1 se bloquea, la iniciativa no ha sido capaz de obtener acceso al objeto de recurso crítico variable de bloqueo correspondiente, por lo que la necesidad de otros hilos (puede ser cualquier subproceso que posee cerradura deseada bandera hilo 1) para notificar ( notify()método) de la rosca, un hilo puede ejecutar a su vez.

Espere

  • espera vacío public final ()
  • espera vacío public final (tiempo de espera)
  • Necesidad para objbloque sincronizado bloqueado, llamada obj.wait()tiempo, este hilo dará a conocer su propiaToda marca de bloqueo. Por lo que este hilo se bloquea objla cola de espera. Liberar el bloqueo, en la cola de espera.
synchronized (临界资源对象){ //对临界资源加锁
	//同步代码块(原子操作)
}

aviso

  • vacío public final notificar ()
  • notufyAll vacío public final ()
  • bloque de código de sincronización debe ser bloqueado en obj. Desde objla waitingliberación de uno o la totalidad de la rosca. Ningún efecto por sí solos.

En cuarto lugar, Código Casos

 Debido a que los hilos de obtener una tajada de tiempo aleatorio, en el ejemplo del código no puede ser reproducida por la pareja de viaje, este ejemplo es ayudar al lector a comprender el punto muerto; casos en que varios de código se debe principalmente a la ayuda de varias maneras entendidas comunicación hilo.

Flujo libera la marca de bloqueo

 Objeto existente un objeto de recurso crítico, hay un hilo MyThreadcuando el hilo entra en un bloque de código de sincronización, indicador de bloqueo de liberación activa (de liberación de bloqueo marcado proceso analógico), esta vez en los hilo espera indefinidamente, sin fin Código no el final.

public class TestWaitNotify {
    public static void main(String[] args){
        Object o = new Object();
        MyThread myThread = new MyThread(o);
        myThread.start();
    }

}
class MyThread extends Thread{

    Object obj;

    public MyThread(Object obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        System.out.println("线程启动");
        synchronized (obj){
            System.out.println("进入同步代码块");

            //主动释放obj锁标记,无限期等待
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("退出同步代码块");
        }
        System.out.println("线程结束");
    }
}

Resultado de la impresión:
Aquí Insertar imagen Descripción
 Así que cuando un hilo comunicados de contadores al bloqueo, debe haber otro hilo para notificar el hilo o el hilo se ha estado en un estado bloqueado.

Los principales notifica hilo hilos MyThread

public class TestWaitNotify {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        MyThread myThread = new MyThread(o);
        myThread.start();

        Thread.sleep(1000);

        synchronized (o){
            System.out.println("main函数进入同步代码块");
            o.notify();//从那些因为o对象而进入无限期等待的线程中,通知一个 并执行完该线程
            System.out.println("main函数退出同步代码块");
        }
    }

}
class MyThread extends Thread{

    Object obj;

    public MyThread(Object obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        System.out.println("线程启动");
        synchronized (obj){
            System.out.println("进入同步代码块");

            //主动释放obj锁标记,无限期等待
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("退出同步代码块");
        }
        System.out.println("线程结束");
    }
}

Resultado de la impresión:
Aquí Insertar imagen Descripción
 debido a que el hilo principal o el bloqueo de objetos y llamar al notify()método, por lo tanto, las discusiones MyThread esperar indefinidamente detuvieron, y luego terminaron, y que si lo hacen múltiples hilos? El hilo conductor de la notificación de quién más?

Que se enroscan la notificación del hilo principal?

public class TestWaitNotify {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        MyThread myThread1 = new MyThread(o);
        MyThread myThread2 = new MyThread(o);
        myThread1.start();
        myThread2.start();

        Thread.sleep(1000);

        synchronized (o){
            System.out.println("main函数进入同步代码块");
            o.notify();//从那些因为o对象而进入无限期等待的线程中,通知一个 并执行完该线程
            System.out.println("main函数退出同步代码块");
        }
    }

}
class MyThread extends Thread{

    Object obj;

    public MyThread(Object obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程启动");
        synchronized (obj){
            System.out.println(Thread.currentThread().getName()+"进入同步代码块");

            //主动释放obj锁标记,无限期等待
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()+"退出同步代码块");
        }
        System.out.println(Thread.currentThread().getName()+"线程结束");
    }
}

 Marque claramente después de que el hilo principal se bloqueará, informar a un hilo, por lo que consiguió el token de bloqueo, que estará terminado, pero esta vez, el nombre de la rosca "thread-1", porque no consiguió el bloqueo del hilo principal marca de bloqueo, caerá en una espera indefinida.
Aquí Insertar imagen Descripción
Si la función principal del bloque de código de sincronización notify()en un proceso de notifyAll()acercamiento?

        synchronized (o){
            System.out.println("main函数进入同步代码块");
            o.notifyAll();
            System.out.println("main函数退出同步代码块");
        }

Resultado de la impresión:
el código está terminado
Aquí Insertar imagen Descripción
 , sin embargo, en este momento Thread-0y Thread-1, dependiendo de quién debe llevar a cabo los resultados del concurso token de bloqueo completa, que compiten con marca de bloqueo, que dará prioridad a la aplicación del resultado de la impresión es claramente Thread-1una prioridad para obtener la variable de bloqueo, y luego Thread-0esperar Thread-1solamente Quiero liberar el bloqueo después de la marca de finalización, y luego la aplicación de este hilo ha terminado;

Publicado 83 artículos originales · ganado elogios 125 · vistas 110 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44717317/article/details/104876831
Recomendado
Clasificación