Являются примитивными типами данных streamобезопасными в Java

Являются примитивными типами данных, такими как int & short thread-safe в Java? Я выполнил следующий код и не мог увидеть ожидаемый результат 500 несколько раз.

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

Здесь одновременно stream 500 будет обновлять переменную int inT . Главный stream после ожидания завершения параллельного обновления, выводит значение inT .

Найдите аналогичный пример здесь

Есть три способа, которыми они небезопасны:

  • long и double даже не гарантированно обновляются атомарно (вы можете видеть половину записи из другого streamа)
  • Модель памяти не гарантирует, что вы увидите последние обновления из одного streamа в другом streamе, без каких-либо дополнительных барьеров памяти
  • Акт приращения переменной в любом случае не является атомарным

Используйте AtomicInteger т. Д. Для streamобезопасных операций.

Примитивные типы не являются streamобезопасными. Проверьте этот учебник.

Я бы предложил использовать classы в java.util.concurrent.atomic. Они предназначены для обеспечения безопасности streamов, и в некоторых случаях JVM может использовать аппаратные функции для оптимизации.

Давайте будем гением компьютера.