高并发场景下System.currentTimeMillis()的性能问题的优化
System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没测试过,有人说是100倍左右)
System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道
后台定时更新时钟,JVM退出时,线程自动回收
思路:使用一个单例 SystemClock对象,对象中开启一个后台线程,每隔一毫秒更新一次clock时间.
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
/**
* 高并发场景下System.currentTimeMillis()的性能问题的优化
* 时间戳打印建议使用
*/
public class SystemClock {
private static final String THREAD_NAME = "system.clock";
private static final SystemClock MILLIS_CLOCK = new SystemClock(1);
private final long precision;
private final AtomicLong now;
private SystemClock(long precision) {
this.precision = precision;
now = new AtomicLong(System.currentTimeMillis());
scheduleClockUpdating();
}
public static SystemClock millisClock() {
return MILLIS_CLOCK;
}
private void scheduleClockUpdating() {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
Thread thread = new Thread(runnable, THREAD_NAME);
thread.setDaemon(true);
return thread;
});
scheduler.scheduleAtFixedRate(() ->
now.set(System.currentTimeMillis()),
precision, precision, TimeUnit.MILLISECONDS);
}
public long now() {
return now.get();
}
}
调用SystemClock.MILLIS_CLOCK.now(); 即可获取当前时间戳(毫秒值)