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

Java中的原始数据类型是否像intshort线程安全的?我执行了以下代码,但有时无法看到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值。

在这里找到类似的例子

回答:

不安全的三种方式:

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

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

以上是 Java中原始数据类型是线程安全的吗 的全部内容, 来源链接: utcz.com/qa/400619.html

回到顶部