原始数据类型在Java中是否是线程安全的

kri*_*hna 34 java primitive thread-safety

Java中的原始数据类型是int&shortthread-safe吗?我已执行以下代码,有时无法看到预期的结果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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里同时500个线程将更新int变量inT.等待并发更新完成后的主线程,打印inT值.

在这里找到类似的例子

Jon*_*eet 58

他们有三种不安全的方法:

  • long并且double甚至不保证以原子方式更新(您可以看到来自不同线程的写入的一半)
  • 内存模型不保证您将在另一个线程中看到来自一个线程的最新更新,而不会出现某种额外的内存障碍
  • 无论如何,递增变量的行为不是原子的

使用AtomicIntegeretc进行线程安全操作.


Par*_*ade 9

原始类型不是线程安全的.查看教程.

  • 那真是怪了.oracle文档实际上说原始类型访问对于int是原子的:https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html (3认同)