并发下获取当前时间类优化

高并发场景下System.currentTimeMillis()的性能问题的优化
System.currentTImeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没有测试过,有人说是100倍左右)
System,currentTimeMillis()之所以慢是因为去跟系统打了一次交道
后台定时更新时钟,JVM退出,线程自动回收

package com.company;

import java.sql.Timestamp;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 高并发场景下System.currentTimeMillis()的性能问题的优化
 * System.currentTimeMillis()的调用比new一个普通对象要耗时得多,具体耗时高出多少我还没有测试过,有人说是100倍左右
 * System.currentTimeMillis()之所以慢是因为去梗系统打了一次交道
 * 后台定时更新时钟,JVM退出时,线程自动回收
 */

public class SystemClock {
    private final long period;
    private final AtomicLong now;

    ExecutorService executor = Executors.newSingleThreadExecutor();

    private static final long periodTime = 1;

    private SystemClock(long period){
        this.period = period;
        this.now = new AtomicLong(System.currentTimeMillis());
        scheduleClockUpdating();
    }

   private static class InstanceHolder{
        public static final SystemClock INSTANCE = new SystemClock(periodTime);
   }

   private static SystemClock instance(){
        return InstanceHolder.INSTANCE;
   }

   private void scheduleClockUpdating(){
       ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
           @Override
           public Thread newThread(Runnable runnable) {
               Thread thread = new Thread(runnable, "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();
   }
   public static long now(){
        return instance().currentTimeMillis();
   }
   public static String nowDate(){
        return new Timestamp(instance().currentTimeMillis()).toString();
   }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章