使用Thread.sleep进入安全点的代码测试记录
package com.caiqiang.safepointTest;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @program: test1
* @description:
* @author: caiqiang
* @create: 2022-09-14 15:31
**/
public class Main {
public static AtomicInteger num = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Runnable runnable=()->{
//Counted Loop 内部没有安全点检查 int及其更小的类型是Counted Loop
//非Counted Loop 循环结尾设置了安全点检查 long以及更大的类型是非Counted Loop(unCounted Loop)
for (int i = 0; i < 1000000000; i++) {
num.getAndAdd(1);
//因为int内部没有安全点检查,是一个长循环,所以主线程Thread.sleep(1000);的native方法返回到达jNI之前进入安全点检查,
//但是长循环没有安全点,导致主线程只能等待其他线程进入安全点,也就是结束循环
//把int换成long就没问题,因为long属于unCounted Loop,每次循环末尾都有安全点设置
}
System.out.println(Thread.currentThread().getName()+"执行结束!");
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
//为什么会有进入安全点的等待操作呢,这里明明没有gc啊
//其实本不是因为gc,而是因为jit的代码缓存,在安全点去清理代码缓存了(具体还是不太懂,大佬源码)
Thread.sleep(1000);
System.out.println("num = " + num);
}
}