Java-在下面的代码中java并发包里的AtomicLong为何不是线程安全的?
大家都说AtomicLong是线程安全的,以下的代码预期输出500,可为什么实际执行时有时输出498、496?是不是我的理解有问题导致哪个地方写错了?
环境:windows XP sp3,jdk1.6.0_27
import java.util.concurrent.atomic.AtomicLong;
public class TestAtomicLong {
private final AtomicLong counter = new AtomicLong(0);
public AtomicLong getCounter() {
return counter;
}
public void test() {
for (int i = 0; i < 500; i++) {
new Thread(new Runnable() {
public void run() {
counter.getAndIncrement();
}
}).start();
}
}
public static void main(String[] args) {
TestAtomicLong obj = new TestAtomicLong();
obj.test();
System.out.println(obj.getCounter());//期望输出500,可有时输出498、496
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个问题不是线程不安全,线程不安全是有可能连续叔叔498、498这样的值。你这样的输出是因为线程执行的不确定性,也就是print的时候并不一定是所有线程都执行完。但是自增只是增加了一次。你可以在print前调用sleep(100),你再试试。
public static void main(String[] args) {
Test2 obj = new Test2();
obj.test();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(obj.getCounter());//期望输出500,可有时输出498、496
}
是并行执行的,但是不是所有的线程都执行完了,需要在main里等待所有的线程都完成,再输出结果,修改如下:
public static void main(String[] args) throws Exception {
TestAtomicLong obj = new TestAtomicLong();
obj.test();
Thread.sleep(100);
System.out.println(obj.getCounter());// 期望输出500,可有时输出498、496
}