gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:57:29 25 4
gpt4 key购买 nike

intshort 这样的原始数据类型在 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值。

查找类似示例here

最佳答案

它们不安全的三种方式:

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

使用 AtomicInteger等线程安全操作。

关于java - Java中的原始数据类型是线程安全的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9278764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com