Fork me on GitHub
文章目录
  1. 1. 首先
  2. 2. 我的第一次
  3. 3. 真相只有一个
  4. 4. 感谢

首先

请允许我做一次标题党(严肃脸),在这篇文章,咱不谈并发编程,也不论AtomicInteger,说点儿我初次使用AtomicInteger时的趣事儿。

我的第一次

话说当初在我看深入理解Java虚拟机一书的时候,看到了AtomicInteger这个类,它是并发条件下的原子自增运算,于是我就打开了IDEA,
输入这段示例代码,想看看运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.concurrent.atomic.AtomicInteger;

/**
* Created by scottwang on 16-8-19.
*/

public class AtomicTest {

public static volatile int race = 0;
public static AtomicInteger ai = new AtomicInteger(0);

public static void increase() {
race++;
ai.incrementAndGet();
}

private static final int THREAD_COUNT = 10000;

public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[THREAD_COUNT];
for (int i = 0; i < THREAD_COUNT; i++) {
threads[i] = new Thread(() -> {
increase();
});
threads[i].start();
}

System.out.println("race = " + race);
System.out.println("ai = " + ai);
}
}

蛋是,奇迹发生了!运行结果是这样的:

race = 9994
ai = 9999

我的天,MD制杖,什么鬼,你跟我说结果不是10000?我把头给看下来,再多运行几次?好勒,次次结果都不一样,我的天!这难道是JDK版本的
问题?不对啊,我的是Ubuntu 16.04的JDK8.0,怎么可能有问题!难道是BUG了?我的天,我竟然发现了JDK的BUG,怎么办,好紧张。。。。。。

真相只有一个

最后,我才知道,原来是我太猴急了,在开启完全部线程之后,直接读取race和ai的值,这要能对就怪了,结果要是10000才是BUG呢。于是,
在输出结果直接加入Thread.sleep(500);,让线程先睡会儿,然后再读取结果,对了!
这件事情告诉我们,细节决定成败。开个玩笑,我们下回再见!

感谢

感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :-)