【发布时间】:2012-02-14 14:38:50
【问题描述】:
像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值。
找到类似的例子here
【问题讨论】:
-
不,它们不是线程安全的。如果你只打算阅读,你应该考虑成为会员
volatile。如果你打算从不同的线程读写它,你应该把它设为synchronized
标签: java thread-safety primitive