Являются ли примитивные типы данных поточно-ориентированными в Java - PullRequest
32 голосов
/ 14 февраля 2012

Являются ли примитивные типы данных типа int & short поточно-ориентированными в 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();
        }
    }
}

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

Найти похожий пример здесь

Ответы [ 3 ]

55 голосов
/ 14 февраля 2012

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

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

Используйте AtomicInteger и т. д. для поточно-ориентированных операций.

9 голосов
/ 14 февраля 2012

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

4 голосов
/ 14 февраля 2012

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

...