亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java SimpleDateFormat線程安全問(wèn)題原理詳解

 更新時(shí)間:2020年05月13日 14:54:31   作者:玄同太子  
這篇文章主要介紹了Java SimpleDateFormat線程安全問(wèn)題原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

今天百度一些資料偶然發(fā)現(xiàn)SimpleDateFormat居然不是線程安全的,平時(shí)使用時(shí)根本沒(méi)有考慮,萬(wàn)幸今天發(fā)現(xiàn)了這個(gè)問(wèn)題,得把寫的代碼得翻出來(lái)整理一下了。

一般我們使用的SimpleDateFormat一般是這樣寫的:

public void method() {
  ...
  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  Date date = dateFormat.parse("2020-05-10 19:53:00");
  ...
}

這樣寫完全沒(méi)有任何問(wèn)題,但我們有時(shí)候會(huì)覺(jué)得重復(fù)創(chuàng)建SimpleDateFormat耗費(fèi)性能,就想到把SimpleDateFormat對(duì)象做為類的靜態(tài)成員變量,那么代碼就是這樣了:

private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

public void method() {
  ...
  Date date = dateFormat.parse("2020-05-10 19:53:00");
  ...
}

我經(jīng)常在Controller做日期轉(zhuǎn)換的時(shí)候就是這么干的,但這樣寫很有問(wèn)題,多線程通知執(zhí)行容易出問(wèn)題,要么轉(zhuǎn)換后的結(jié)果不對(duì),要么報(bào)錯(cuò),我們測(cè)試一下:

public class DateUtils {
  private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  public static Date prase(String date) throws ParseException {
    return dateFormat.parse(date);
  }

  static class Job extends Thread {
    @Override
    public void run() {
      try {
        System.out.println(this.getName() + ":" + DateUtils.prase("2020-05-10 19:53:00"));
      } catch (ParseException e) {
      }
    }
  }

  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
      new Job().start();
    }
  }
}

測(cè)試結(jié)果如下:

那有沒(méi)有好的解決方案呢,既不用重復(fù)創(chuàng)建對(duì)象,又保證線程安全呢?答案是有。

方法一:使用ThreadLocal

public class MyController {
  private static ThreadLocal<DateFormat> local = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
      return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    };
  };
  
  public void method() {
    ...
    Date date = local.get().parse("2020-05-10 19:53:00");
    ...
  }
}

方法二:使用第三方apache提供工具包c(diǎn)ommons-lang3

import org.apache.commons.lang3.time.FastDateFormat;
public class MyController {
  public void method() {
    ...
    Date date = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss").parse("2020-05-10 19:53:00");
    ...
  }
}

推薦使用第二種,既快有方便。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論