1 .最近一直在看<深入理解java虚拟机>一书。
看到多线程部分的时候,里面有一段代码不太理解就照着写了一遍,我用的是Idea
代码如下:
public class Test {
private volatile int inc = 0;
private void increase(){
inc++;
}
public static void main(String[] args) {
final Test test = new Test();
for (int i = 0; i < 10; i++) {
new Thread(){
@Override
public void run() {
for (int j = 0; j < 1000; j++) {
test.increase();
}
}
}.start();
}
while (Thread.activeCount()>1){
Thread.currentThread().getThreadGroup().list();
System.out.println("活跃线程的数量1:"+Thread.activeCount());
Thread.yield();
}
System.out.println("活跃线程的数量2:"+Thread.activeCount());
System.out.println(test.inc);
}
}
代码比较简单,就是为了验证volatile不能保证原子性。
控制台一直阻塞,什么也不输出,然后尝试着打了断点,发现可以很快的输出结果,百思不得其解。然后,尝试着输出Thread.activeCount的值,发现此值一直为2。不是期待的1。
然后查了一下资料,发现是因为Idea工具的原因,IntelliJ Idea执行用户的代码使用的是反射的方式,与此同时会创建一个Monitor Ctrl-Break的线程用于监控的目的。所以主线程main+监控线层,最后会剩余两个线程。
相同的代码,用java命令执行就没有问题。
所以将Thread.activeCount的判断值改为Thread.activeCount > 2即可。