2012-02-14 14 views
26

Son 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.¿Los tipos de datos primitivos son seguros para subprocesos en Java

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í concurrentemente 500 hilo actualizar la variable int inT. El hilo principal después de esperar que se complete la actualización simultánea, imprime el valor inT.

Encuentra ejemplo similar here

+9

No, no son seguros para subprocesos. Si solo planea leer, debería considerar hacer al miembro 'volátil'. Si planea leer y escribir desde diferentes hilos, debe hacerlo 'sincronizado' –

Respuesta

45

Hay tres formas en las que no es seguro:

  • long y double ni siquiera están garantizados para ser actualizado de forma atómica (se podía ver la mitad de una escritura de un hilo diferente)
  • El modelo de memoria no garantiza que verá las últimas actualizaciones de un hilo en otro hilo, sin barreras de memoria extra de algún tipo
  • El acto de incrementar una variable no es atómico de todos modos

Use AtomicInteger etc. para operaciones seguras con hilos.

4

Sugeriría usar clases en java.util.concurrent.atomic. Están diseñados para seguridad de subprocesos y, en algunos casos, JVM puede aprovechar las características de hardware para optimizar.

10

Los tipos primitivos no son seguros para subprocesos. Consulte this tutorial.

+0

El punto clave es que si una primitiva se definiera como parte de una instancia de un objeto, esa primitiva estaría en el montón, y no a salvo de amenazas. – okwap

+2

Eso es raro. La documentación del oráculo en realidad dice que el acceso de tipo primitivo es atómico para int: https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html – Yamcha

+1

@Parvin, excepto para los tipos primitivos largo y doble, se garantiza que serán atómico. Si está leyendo o escribiendo el valor, su hilo es seguro para esa operación. – Pacerier

Cuestiones relacionadas