美文网首页
2019-11-21 高并发下System.currentTim

2019-11-21 高并发下System.currentTim

作者: Albert陈凯 | 来源:发表于2019-11-21 12:04 被阅读0次

前言

在高并发场景下System.currentTimeMillis()并发问题严重,甚至比创建一个普通对象要耗时的多;在系统中有时候不可避免要打印一些时间戳,但怎么做才更好呢。

代码实现

iimport 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();    }}

调用示例
Long start = SystemClock.millisClock().now()

测试对比

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

输出结果是:
SystemClock Time:2741毫秒
SystemCurrentTimeMillis Time:14072毫秒
五倍的效率

细节决定成败,敬畏每一行代码,代码优化永无止境!

转载于:https://www.cnblogs.com/mengq0815/p/10596067.html

相关文章

  • 2019-11-21 高并发下System.currentTim

    前言 在高并发场景下System.currentTimeMillis()并发问题严重,甚至比创建一个普通对象要耗时...

  • JAVA优化篇1-优化高并发下System.currentTim

    1. 目前获取时间的方式 一般我们获取当前时间有两种方式: 或者 但实际上new Date()的源码中也将调用Sy...

  • 高并发下开发感悟

    公司最近接了一个高并发的项目;这个项目才做到一半,感觉像脱了一层皮一样,记录下一些感悟~ 1、高并发下开发一定要谨...

  • 高性能无锁并发框架Disruptor,太强了

    Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的...

  • 高并发与缓存

    本文主要讲述高并发下缓存会出现的问题。 在高并发下,缓存会出现的问题有:缓存一致性、并发问题、穿透问题、缓存的雪崩...

  • 高并发下的sql优化

    假设有数据库表中有列(列名是energy),作为一个计数器,这个计数器有一个上限。用户发来一个请求,参数是一个随机...

  • 高并发下的mysql问题

    高并发下的mysql问题 mysql 重复插入问题 业务需要先根据where条件查询,如有数据命中对其进行修改否则...

  • 漫画:高并发下的HashMap

    上一期我们介绍了HashMap的基本原理。 这一期我们来讲解高并发环境下,HashMap可能出现的致命问题。 Ha...

  • 高并发下的 Nginx 优化

    我已经谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apach...

  • Nginx高并发下的优化

    Nginx高并发下的优化 写在前面 最近在进行服务器的优化,正好在看nginx相关的知识,所以把一些知识整理一下。...

网友评论

      本文标题:2019-11-21 高并发下System.currentTim

      本文链接:https://www.haomeiwen.com/subject/ruozictx.html