java版本:8
代码如下
public class Test {
public static int num = 0;
public static void main(String[] args) throws InterruptedException {
Runnable runnable=()->{
long beginTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
for (int j = 0; j < 10; j++) {
num++;
}
}
System.out.println("子线程执行结束,耗时:" + (System.currentTimeMillis() - beginTime));
};
new Thread(runnable).start();
new Thread(runnable).start();
long beginTime = System.currentTimeMillis();
Thread.sleep(1000);
System.out.println("主线程睡眠时间:" + (System.currentTimeMillis()-beginTime));
System.out.println("num = " + num);
}
}
运行上面代码时,运行打印如下:
子线程执行结束,耗时:3263
子线程执行结束,耗时:3265
主线程睡眠时间:3265
num = 1768648854
可以看到主线程睡眠时间应该是1000但是实际是3265,经过翻找答案可知是由于safepoint机制导致的,所以safepoint触发的机制是什么,上面的代码何时触发了safepoint,为什么将Thread.sleep的时间调整到500时,输出的结果就正常了,下面时正常的输出结果:
主线程睡眠时间:506
num = 1906054945
子线程执行结束,耗时:2764
子线程执行结束,耗时:2764