java currenttimemillis 效率_高并发场景下System.currentTimeMillis()的性能问题的优化
前言
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()的性能问题的优化相关推荐
- 队列处理高并发_高并发场景下缓存处理的一些思路
在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现. 但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据 ...
- java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...
- 本地缓存需要高时效性怎么办_缓存在高并发场景下的常见问题
缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...
- 读数据库遇到空就进行不下去_如何解决高并发场景下缓存+数据库双写不一致问题?...
推荐阅读: 一只Tom猫:手撕分布式技术:限流.通讯.缓存,全部一锅端走送给你!zhuanlan.zhihu.com 一只Tom猫:MySQL复习:20道常见面试题(含答案)+21条MySQL性能调 ...
- 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...
- java高并发(二十一)高并发场景下缓存常见问题
缓存一致性 当数据实时性要求很高时,需要保证缓存中的数据与数据库中的数据一致,缓存节点与副本中的数据一致,不能出现差异现象,这就比较依赖缓存的过期和更新策略了.一般会在数据发生更改的时候,主动跟新缓存 ...
- 并发经验八年架构师:缓存在高并发场景下该如何问题
缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...
- 高并发场景下数据库的常见问题及解决方案
一.分库分表 (1)为什么要分库分表 随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且 ...
- 高并发场景下缓存的常见问题
作者介绍: 丁浪,非著名架构师.关注高并发.高可用的架构设计,对系统服务化.分库分表.性能调优等方面有深入研究和丰富实践经验.热衷于技术研究和分享. 声明:版权归丁浪作者本人所有,转载请联系作者本人 ...
最新文章
- C语言 字符型操作(就自己做个笔记储存一下)
- webpack入门+react环境配置
- Python小白学习之函数装饰器
- python程序后台运行的实现
- 4、Hive数据操作,DDL操作,CRUD database,CRUD table,partition,view,index,show命令等
- Win10环境下,word2016嵌入mathtype出现灰色的解决办法
- 复试计算机网络与软件工程,2018华南理工大学软件工程复试经验贴
- cesium html源码,Cesium源码的本地运行及调试
- 应用架构的核心使命是什么?阿里高级技术专家这样说
- js获取图片真实尺寸 - 代码篇
- c语言程序设计逗号作用,逗号运算符C语言程序设计.pdf
- Android实现新浪微博和QQ登陆并获取用户的信息
- 上学期间你收到最感动的小纸条是什么?
- Python-Bunch模式
- 电脑桌面打开计算机窗口,电脑怎么打开运行窗口
- 大数据千亿级离线数仓项目第三天 维度数据分析与业务开发
- 适合苹果的蓝牙耳机推荐,音质超好的蓝牙耳机推荐
- 表连接on 和where的区别
- Java开源工具库使用之java源代码生成库JavaPoet
- Kali使用Aircrack-ng进行暴力破解WIFI密码
热门文章
- python画黑白线条_女朋友要你给她画个素描?不要慌,教你用Python分分钟弄出来!...
- 高德地图POI数据2020年高德POI
- ubuntu20.04独显和集显切换安装英伟达驱动
- Clion使用Socket报错undefined reference to `__imp_WSAStartup‘(解决办法)
- ui设计师的职责与岗位要求
- scale out instead of scale up
- 项目架构——面向对象与软件工程实验五
- linux网络性能测试工具Iperf使用介绍
- 电影最top,《撞车》摘录
- 夺命追击(Murderous Pursuits)服务器搭建教程