¿Son los tipos de datos primitivos seguros para subprocesos en Java?
thread-safety primitive (3)
Hay tres formas en que no son seguras:
-
long
ydouble
ni siquiera se garantiza que se actualicen de forma atómica (puede ver la mitad de una escritura desde un hilo diferente) - El modelo de memoria no garantiza que verá las últimas actualizaciones de un subproceso en otro subproceso, sin barreras de memoria adicionales de algún tipo
- El acto de incrementar una variable no es atómico de todos modos
Utilice AtomicInteger
etc. para operaciones seguras con subprocesos.
¿Los tipos de datos primitivos como int
& short
thread-safe en Java? He ejecutado el siguiente código y no pude ver el resultado esperado 500 algunas veces.
public class SampleThree extends Thread
{
static long wakeUpTime = System.currentTimeMillis() + (1000*20);
static int inT;
public static void main(String args[])
{
System.out.println("initial:" + inT);
for(int i=0; i<500; i++)
new SampleThree().start();
try {
Thread.sleep(wakeUpTime - System.currentTimeMillis() + (1000*30));
System.out.println("o/p:" + inT);
}
catch(Exception e){
e.printStackTrace();
}
}
public void run()
{
try {
long s = wakeUpTime - System.currentTimeMillis();
System.out.println("will sleep ms: " + s);
Thread.sleep(s);
inT++; // System.out.println(inT);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
Aquí, al mismo tiempo, 500 hilos actualizarán la variable int inT
. El hilo principal después de esperar a que se complete la actualización concurrente, imprime el valor inT
.
Encuentra un ejemplo similar here
Los tipos primitivos no son seguros para hilos. Revisa this tutorial.
Sugeriría utilizar clases en java.util.concurrent.atomic. Están diseñados para la seguridad de subprocesos y, en algunos casos, la JVM puede aprovechar las características de hardware para optimizar.