Java中原始数据类型是线程安全的吗
Java中的原始数据类型是否像int
&short
线程安全的?我执行了以下代码,但有时无法看到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
甚至不保证会自动进行更新(您可能会看到来自不同线程的写入的一半)- 内存模型不能保证您会看到一个线程在另一个线程中的最新更新,而没有某种额外的内存障碍
- 无论如何,增加变量的行为不是原子的
使用AtomicInteger
etc进行线程安全操作。
以上是 Java中原始数据类型是线程安全的吗 的全部内容, 来源链接: utcz.com/qa/400619.html