博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高并发场景下System.currentTimeMillis()的性能优化
阅读量:5150 次
发布时间:2019-06-13

本文共 2043 字,大约阅读时间需要 6 分钟。

一、前言

System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法,

有时不得不使用,比如生成wokerId、打印日志什么的,在高并发情形下肯定存在性能问题的,但怎么做才好呢? System.currentTimeMillis()之所以慢是因为

去跟系统打了一次交道。那什么快?内存!如果该方法从内存直接取数,那不就美滋滋了。

二、代码实现

public class SystemClock { private final long period; private final AtomicLong now; private SystemClock(long period) { this.period = period; this.now = new AtomicLong(System.currentTimeMillis()); scheduleClockUpdating(); } private static SystemClock instance() { return InstanceHolder.INSTANCE; } public static long now() { return instance().currentTimeMillis(); } public static String nowDate() { return new Timestamp(instance().currentTimeMillis()).toString(); } private void scheduleClockUpdating() { ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r, "System Clock"); thread.setDaemon(true); return thread; } }); scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { now.set(System.currentTimeMillis()); } }, period, period, TimeUnit.MILLISECONDS); } private long currentTimeMillis() { return now.get(); } private static class InstanceHolder { public static final SystemClock INSTANCE = new SystemClock(1); } }

用的时候直接调用SystemClock.now();就ok了。

测试

写了一个简单的测试代码:

public static void main(String[] args) { long start = System.currentTimeMillis(); for (long i = 0; i < Integer.MAX_VALUE; i++) { SystemClock.now(); } long end = System.currentTimeMillis(); System.out.println("SystemClock Time:" + (end - start) + "毫秒"); long start2 = System.currentTimeMillis(); for (long i = 0; i < Integer.MAX_VALUE; i++) { System.currentTimeMillis(); } long end2 = System.currentTimeMillis(); System.out.println("currentTimeMillis Time:" + (end2 - start2) + "毫秒"); }

输出结果是:

  SystemClock Time:1787毫秒
  currentTimeMillis Time:33851毫秒
  看着结果效率提升还是挺明显的。

  所有的进步都是不稳定, 一个问题解决了又不得不面对一个新的问题。
 
转载自:https://www.cnblogs.com/nyvi/p/8837012.html

转载于:https://www.cnblogs.com/junjiang3/p/9195074.html

你可能感兴趣的文章
不一样的编辑器
查看>>
博客园安家--写给自己
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
python 列表中的数字转为字符串
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
js深度克隆对象、数组
查看>>
c++ 贪吃蛇
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
图论求割点模板
查看>>
poj3903 Stock Exchange 二分+dp
查看>>
Okhttp代码
查看>>
点击树结构实现变色
查看>>
【IT笔试面试题整理】字符串的排列
查看>>
算法描述---伪代码
查看>>
RT-thread 设备驱动组件之IIC总线设备
查看>>
Windows下切分文件(GnuWin32)
查看>>
sqlca.sqlcode
查看>>