java thread-safety primitive

¿Son los tipos de datos primitivos seguros para subprocesos en Java?



thread-safety primitive (3)

Hay tres formas en que no son seguras:

  • long y double 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.