Java-在下面的代码中java并发包里的AtomicLong为何不是线程安全的?

发布于 2016-11-01 12:29:25 字数 880 浏览 1570 评论 2

大家都说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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜柠檬 2017-01-13 06:11:48

这个问题不是线程不安全,线程不安全是有可能连续叔叔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
}

瑾兮 2016-12-01 08:38:37

是并行执行的,但是不是所有的线程都执行完了,需要在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
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文