前言

System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如生成wokerId、打印日志什么的,在高并发情形下肯定存在性能问题的,但怎么做才好呢? System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道。那什么快?内存!如果该方法从内存直接取数,那不就美滋滋了。

代码实现

package com.nyvi.support.util;

import java.sql.Timestamp;

import java.util.concurrent.ScheduledThreadPoolExecutor;

import java.util.concurrent.ThreadFactory;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicLong;

/**

*

* 高并发场景下System.currentTimeMillis()的性能问题的优化

*

* @author czk

*/

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毫秒

看着结果效率提升还是挺明显的。

java currenttimemillis 效率_高并发场景下System.currentTimeMillis()的性能问题的优化相关推荐

  1. 队列处理高并发_高并发场景下缓存处理的一些思路

    在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现. 但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据 ...

  2. java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  3. 本地缓存需要高时效性怎么办_缓存在高并发场景下的常见问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  4. 读数据库遇到空就进行不下去_如何解决高并发场景下缓存+数据库双写不一致问题?...

    推荐阅读: 一只Tom猫:手撕分布式技术:限流.通讯.缓存,全部一锅端走送给你!​zhuanlan.zhihu.com 一只Tom猫:MySQL复习:20道常见面试题(含答案)+21条MySQL性能调 ...

  5. 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  6. java高并发(二十一)高并发场景下缓存常见问题

    缓存一致性 当数据实时性要求很高时,需要保证缓存中的数据与数据库中的数据一致,缓存节点与副本中的数据一致,不能出现差异现象,这就比较依赖缓存的过期和更新策略了.一般会在数据发生更改的时候,主动跟新缓存 ...

  7. 并发经验八年架构师:缓存在高并发场景下该如何问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  8. 高并发场景下数据库的常见问题及解决方案

    一.分库分表 (1)为什么要分库分表 随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且 ...

  9. 高并发场景下缓存的常见问题

    作者介绍: 丁浪,非著名架构师.关注高并发.高可用的架构设计,对系统服务化.分库分表.性能调优等方面有深入研究和丰富实践经验.热衷于技术研究和分享. 声明:版权归丁浪作者本人所有,转载请联系作者本人 ...

最新文章

  1. C语言 字符型操作(就自己做个笔记储存一下)
  2. webpack入门+react环境配置
  3. Python小白学习之函数装饰器
  4. python程序后台运行的实现
  5. 4、Hive数据操作,DDL操作,CRUD database,CRUD table,partition,view,index,show命令等
  6. Win10环境下,word2016嵌入mathtype出现灰色的解决办法
  7. 复试计算机网络与软件工程,2018华南理工大学软件工程复试经验贴
  8. cesium html源码,Cesium源码的本地运行及调试
  9. 应用架构的核心使命是什么?阿里高级技术专家这样说
  10. js获取图片真实尺寸 - 代码篇
  11. c语言程序设计逗号作用,逗号运算符C语言程序设计.pdf
  12. Android实现新浪微博和QQ登陆并获取用户的信息
  13. 上学期间你收到最感动的小纸条是什么?
  14. Python-Bunch模式
  15. 电脑桌面打开计算机窗口,电脑怎么打开运行窗口
  16. 大数据千亿级离线数仓项目第三天 维度数据分析与业务开发
  17. 适合苹果的蓝牙耳机推荐,音质超好的蓝牙耳机推荐
  18. 表连接on 和where的区别
  19. Java开源工具库使用之java源代码生成库JavaPoet
  20. Kali使用Aircrack-ng进行暴力破解WIFI密码

热门文章

  1. python画黑白线条_女朋友要你给她画个素描?不要慌,教你用Python分分钟弄出来!...
  2. 高德地图POI数据2020年高德POI
  3. ubuntu20.04独显和集显切换安装英伟达驱动
  4. Clion使用Socket报错undefined reference to `__imp_WSAStartup‘(解决办法)
  5. ui设计师的职责与岗位要求
  6. scale out instead of scale up
  7. 项目架构——面向对象与软件工程实验五
  8. linux网络性能测试工具Iperf使用介绍
  9. 电影最top,《撞车》摘录
  10. 夺命追击(Murderous Pursuits)服务器搭建教程