I tipi di dati primitivi sono thread-safe in Java

I tipi di dati primitivi come int e short thread-safe in Java? Ho eseguito il codice seguente e non sono riuscito a visualizzare il risultato previsto 500 alcune volte.

 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(); } } } 

Qui contemporaneamente 500 thread aggiornerà la variabile int inT . Thread principale dopo aver atteso che l’aggiornamento simultaneo sia completato, stampa in inT .

Trova un esempio simile qui

Ci sono tre modi in cui non sono sicuri:

  • long e double non sono nemmeno garantiti per essere aggiornati atomicamente (potresti vedere metà di una scrittura da un thread diverso)
  • Il modello di memoria non garantisce che vedrai gli ultimi aggiornamenti da un thread in un altro thread, senza barriere di memoria aggiuntive di qualche tipo
  • L’atto di incrementare una variabile non è comunque atomico

Utilizzare AtomicInteger ecc per operazioni thread-safe.

I tipi primitivi non sono thread-safe. Controlla questo tutorial.

Suggerirei di utilizzare le classi in java.util.concurrent.atomic. Sono progettati per la sicurezza del thread e in alcuni casi la JVM può sfruttare le funzionalità hardware per ottimizzare.