Sí, esto es similar al método onSpinWait() de la clase Thread - Java 9 , pero un poco más matizado...
static boolean isPrime(long candidate) { if ((candidate & 1) == 0) // filter out even numbers return (candidate == 2); // except for 2 var limit = (long) Math.nextUp(Math.sqrt(candidate)); for (long divisor = 3; divisor <= limit; divisor += 2) { Thread.onSpinWait(); // TODO is this a good practice in this context? if (candidate % divisor == 0) return false; } return true; } El javadoc para Thread.onSpinWait() dice
Indica que la persona que llama no puede avanzar momentáneamente, hasta que ocurra una o más acciones por parte de otras actividades. Al invocar este método dentro de cada iteración de una construcción de bucle de giro y espera, el subproceso de llamada indica al tiempo de ejecución que está ocupado esperando. El tiempo de ejecución puede tomar medidas para mejorar el rendimiento de la invocación de construcciones de bucles de giro y espera.
Sin embargo, en mi caso de uso, esto no es exactamente una espera ocupada, en realidad está haciendo un trabajo útil. Mi intención con Thread.onSpinWait() es dar una pista a la JVM para inyectar algo de optimización si es posible.
En las pruebas, el uso de Thread.onSpinWait() definitivamente incurre en una gran penalización de rendimiento, pero ¿hay alguna razón para creer que podría beneficiar a otros subprocesos que se ejecutan en la misma JVM, el mismo sistema operativo? Por ejemplo, ¿el uso Thread.onSpinWait() ofrece algo de amabilidad a otros subprocesos? Por ejemplo, ¿esto empuja mi hilo/tarea a un segundo plano o cambia su prioridad, sin tener que recurrir a la gestión de prioridad de hilos?
Supongo que podría probar esto, pero sería algo difícil de probar... 🤔
Sin saber qué hace específicamente la JVM con esta sugerencia, es difícil para mí razonar sobre...