Hilo no puede ser llamado

K.JH:
class client
{
    static int data = 0;
    public static void main(String[] args)
    {
        new Thread(new Runnable() 
        {
            @Override
            public void run()
            {
                while(true)
                {
                    //System.out.print("");
                    if(data == 1) {System.out.println("GOTCHA");}
                }
            }
        }).start();
        Scanner sc = new Scanner(System.in);
        while(true)
        {
            data = sc.nextInt();
        }
    }
}

No entiendo por qué no funciona cuando escribo 1. y hay una situación divertida que si quito comentario (System.out.print ( "")), funciona. Puedo hacer de otra manera como devolución de llamada Método, solamente quiero por lo que no funciona.

Stephen C:

La versión corta es que las variables compartidas SEA deben ser declarados como volatileO accesos / cambios a las variables se deben hacer uso de un mecanismo de sincronización apropiada. Un mecanismo de sincronización apropiada podría ser:

  • Uso de monitores primitivos; es decir, synchronizedbloques o métodos con el mismo objeto de destino.

  • El uso de un Lock.acquirey Lock.releaseen el mismo objeto de bloqueo.

  • Otra cosa con la apropiada ocurre antes de las relaciones. (No se preocupe por este caso. Es complicado. Pero si se quiere, leer sobre el modelo de memoria de Java).

En cualquier caso, si dos hilos comparten una variable (no volátil) sin sincronización apropiada, a continuación, un hilo no está garantizada 1 para ver el valor escrito por el otro hilo. Eso es lo que estaba ocurriendo con su ejemplo. El hilo hijo nunca ve los resultados de la escritura de la rosca de los padres.

Este es un comportamiento normal con múltiples hilos en Java. Y una de las razones por las cuales la programación concurrente en Java es complicado.


1 - En algunos casos, los datos serán visibles, y otros no lo harán. Puede depender de la versión de Java, el sistema operativo, la plataforma de hardware, si está depurando o no, y varias otras cosas. Hay al menos dos posibles causas de los problemas de visibilidad. 1) A menudo es debido a problemas de almacenamiento en caché de memoria; por ejemplo, los cambios realizados por un hilo no se hizo fluir a la memoria principal de manera que el otro hilo puede verlos. 2) Alternativamente, podría (al menos en teoría) ser debido al compilador JIT optimización de distancia recuperaciones de memoria. Para entender exactamente lo que está pasando, lo que tendría que analizar el código nativo emitida por el compilador JIT. Pero de cualquier manera, estos comportamientos están permitidas por el modelo de memoria de Java ... si el requerido sucede antes no existen relaciones.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=340369&siteId=1
Recomendado
Clasificación