<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      System.currentTimeMillis()高并發性能優化

      摘要:System.currentTimeMillis()性能問題的研究、測試與優化。

      ??性能優化使用的測試環境:

      jdk版本jdk8

      ??操作系統:

      • macOS
      • 版本:13.2.1
      • 芯片: Apple M1
      • CPU核數:8核

      ??System.currentTimeMillis()是Java極其常用的 API,廣泛地用來獲取時間戳或統計代碼執行耗時等,在我們的印象中應該快如閃電。但實際上在高并發、低延時的情況下,其性能表現令人大跌眼鏡,調用開銷明顯變高。

          public static void main(String[] args) throws Exception {
              singleThreadTest();
              multiThreadTest();
          }
          public static void singleThreadTest() {
              //測試一百次循環,每次循環調用System.currentTimeMillis()1千萬次數
              for (int t = 0; t < 100; t++) {
                  StopWatch stopWatch = new StopWatch();
                  stopWatch.start();
                  //獲取一千萬次時間
                  for (int i = 0; i < 10000000; i++) {
                      System.currentTimeMillis();
                  }
                  stopWatch.stop();
                  System.out.println(stopWatch.getTotalTimeMillis());
              }
          }
      
          public static void multiThreadTest() throws Exception {
              //100個線程各執行一次
              CountDownLatch wait = new CountDownLatch(1);
              int loopNum = 100;
              CountDownLatch threadLatch = new CountDownLatch(loopNum);
              for (int i = 0; i < loopNum; i++) {
                  new Thread(() -> {
                      try {
                          StopWatch watch = new StopWatch();
                          //先阻塞住所有線程
                          wait.await();
                          watch.start();
                          for (int j = 0; j < 10000; j++) {
                              System.currentTimeMillis();
                          }
                          watch.stop();
                          System.out.println(watch.getTotalTimeNanos());
                      } catch (InterruptedException e) {
      
                      } finally {
                          threadLatch.countDown();
                      }
                  }).start();
              }
              wait.countDown();
              threadLatch.await();
          }
      

      ??執行后,控制臺打印的部分執行結果如下:

      ??由此可見,單線程執行System.currentTimeMillis()比多線程并發執行快了太多倍。至于為什么這么慢,感興趣的童鞋可以去問問度娘,這里給出一個基于定時任務按照毫秒更新緩存時間戳的方案,也就是在內存中維護一個全局緩存,其它線程取時間戳時從內存讀取,代價就是犧牲了一些精確度。具體代碼如下:

      import java.util.concurrent.ScheduledThreadPoolExecutor;
      import java.util.concurrent.TimeUnit;
      import java.util.concurrent.atomic.AtomicLong;
      
      /**
       * @Author Wiener
       * @Date 2023-08-12
       * @Description: 緩存系統時間
       */
      public class SystemClock {
      
          private final int period;
          private final AtomicLong now;
      
          private static final String THREAD_NAME ="wienerClock";
      
          private static class InstanceHolder {
              private static final SystemClock INSTANCE = new SystemClock(1);
          }
      
          private SystemClock(int period) {
              this.period = period;
              this.now = new AtomicLong(System.currentTimeMillis());
              scheduleClockUpdating();
          }
      
          private static SystemClock instance() {
              return InstanceHolder.INSTANCE;
          }
      
          /**
           * 供消費者調用,以替換原來的System.currentTimeMillis()
           */
          public static long now() {
              return instance().now.get();
          }
          private void scheduleClockUpdating() {
              ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1, r -> {
                  Thread thread = new Thread(r, THREAD_NAME);
                  thread.setDaemon(true);
                  return thread;
              });
              // 每毫秒獲取一次系統時間,并賦值給 AtomicLong now
              scheduler.scheduleAtFixedRate(() -> now.set(System.currentTimeMillis()), period, period, TimeUnit.MILLISECONDS);
          }
      
      }
      

      ??在并發量大的情況下,使用SystemClock.now()輸出當前時間,有一定精度損失,但是提高了系統時間獲取效率。

      ??溫馨提示,在System.currentTimeMillis()的效率沒有影響程序整體吞吐量時,沒有必要做這種優化,這只是為高并發情況準備的。

      posted @ 2023-08-13 12:18  樓蘭胡楊  閱讀(1218)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 农村欧美丰满熟妇xxxx| 日韩高清免费一码二码三码| 欧美巨大极度另类| 性欧美老人牲交xxxxx视频| 米奇亚洲国产精品思久久| 久久国产精品不只是精品| 国产乱子伦一区二区三区视频播放 | 亚洲一二三四区中文字幕| 无码伊人久久大杳蕉中文无码| 国产成人精品无人区一区| 久久综合国产一区二区三区 | 国产中文字幕精品在线| 久久人人97超碰精品| 亚洲一二区制服无码中字| 亚洲а∨天堂久久精品2021| 欧洲码亚洲码的区别入口| 人妻少妇偷人无码视频| 亚洲一区二区三区播放 | 亚洲国产成人AⅤ片在线观看| 国产乱子伦视频在线播放 | 一本加勒比hezyo无码人妻| 国语偷拍视频一区二区三区| 成人精品视频一区二区三区| AV无码不卡一区二区三区| 强奷乱码欧妇女中文字幕熟女| 亚洲国产精品成人精品无码区在线| 日韩精品亚洲专区在线观看| a级黑人大硬长爽猛出猛进| 2021久久精品国产99国产精品| 老色99久久九九爱精品| 丰满爆乳一区二区三区| 欧洲熟妇色xxxx欧美老妇多毛网站| 国产偷国产偷亚洲高清日韩| 巨胸美乳无码人妻视频漫画| 无码人妻aⅴ一区二区三区蜜桃| 国产精品亚洲二区在线播放| 中文国产成人久久精品小说| 国产亚洲精品第一综合另类无码无遮挡又大又爽又黄的视频 | 熟女少妇精品一区二区| 高清美女视频一区二区三区| 久久亚洲人成网站|