una llamada a dormir recargará los valores almacenados en caché en registros en java?

En Java Spec 17.3 Sueño y rendimiento

17.3 Sueño y rendimiento

Thread.sleep hace que el subproceso que se está ejecutando actualmente se suspenda (cesa temporalmente la ejecución) durante el tiempo especificado, sujeto a la precisión y exactitud de los temporizadores y programadores del sistema. El hilo no pierde la propiedad de ningún monitor, y la reanudación de la ejecución dependerá de la programación y la disponibilidad de procesadores en los que ejecutar el hilo.

Es importante tener en cuenta que ni Thread.sleep ni Thread.yield tienen semántica de sincronización. En particular, el compilador no tiene que vaciar las escrituras almacenadas en caché en registros en la memoria compartida antes de una llamada a Thread.sleep o Thread.yield, ni el compilador tiene que recargar los valores almacenados en caché en los registros después de una llamada a Thread.sleep o Thread .rendimiento.

Por ejemplo, en el siguiente fragmento de código (roto), suponga que this.done es un campo booleano no volátil:

while (!this.done)
    Thread.sleep(1000);

El compilador puede leer el campo this.done solo una vez y reutilizar el valor almacenado en caché en cada ejecución del bucle. Esto significaría que el ciclo nunca terminaría, incluso si otro hilo cambiara el valor de this.done

describe que el hilo nunca recarga la variable almacenada en caché en los registros, pero cuando ejecuto el siguiente código, no funciona, el ciclo termina

public class TestDemo {

    private  static boolean  keepRunning = true;

    public static void main(String[] args)  throws Exception {
        new Thread(
            ()->{
                while (keepRunning){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {

                    }
                }
                System.out.println("loop terminates");
            }
        ).start();
        Thread.sleep(1000);
        keepRunning = false;
        System.out.println("keepRunning is false now");
    }
}

El resultado es :

¿Hay algo diferente con el código en Java Spec 17.3?

¿Por qué el campo keepRunning se vuelve a cargar después de una llamada para dormir?

    C:\Users\LuoYY\Desktop>javac TestDemo.java

    C:\Users\LuoYY\Desktop>java TestDemo
    keepRunning is false now
    loop terminates
Respuesta 1

La especificación no dice que el compilador (o el tiempo de ejecución) debe asegurarse de que el campo nunca se vuelva a cargar o sincronizar con otros subprocesos.

"no tiene que", "es libre de", "no tiene semántica"

Solo dice que tal comportamiento está permitido (porque tiene sentido en las optimizaciones de rendimiento).

Entonces, cuando se trata de varios subprocesos, debe ser explícito sobre cómo debería funcionar: hacerlo volátil o hacerlo subproceso local.

Respuesta: 2

Recientemente cambié el script gwt.xml para compilar solo 1 permutación (es decir, solo 8), esto resuelve mi problema anterior, sin embargo, surge un problema cosmético, que es una ventana emergente molesta que aparece cada vez ...

Estoy tratando de crear una función que compare todos los elementos de una matriz con todos los elementos de una segunda matriz y devolverá todas las coincidencias posibles, y un mensaje si no se encuentran coincidencias. Cuando trato de ...

Estoy tratando de obtener campos de datos específicos de la API Java de Bloomberg. Veo en la guía de desarrolladores que puedo extraer algunos campos con: Request request = refDataSvc.createRequest ("...

Estoy escribiendo contenidos en archivo pdf. Cuando escribo letras hebreas ("שלום") Las letras no aparecen en el pdf. Por cierto, es un problema de codificación, de todos modos, ¿cómo puedo escribir hebreo en un archivo pdf?