JavaSimpleDateFormat線程的安全問題

這篇文章主要講解了Java SimpleDateFormat線程的安全問題,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

創(chuàng)新互聯(lián)專注于和縣網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供和縣營銷型網(wǎng)站建設(shè),和縣網(wǎng)站制作、和縣網(wǎng)頁設(shè)計(jì)、和縣網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造和縣網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供和縣網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

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

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

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

這樣寫完全沒有任何問題,但我們有時(shí)候會(huì)覺得重復(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í)候就是這么干的,但這樣寫很有問題,多線程通知執(zhí)行容易出問題,要么轉(zhuǎn)換后的結(jié)果不對(duì),要么報(bào)錯(cuò),我們測試一下:

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

測試結(jié)果如下:

Java SimpleDateFormat線程的安全問題

那有沒有好的解決方案呢,既不用重復(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");
    ...
  }
}

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

看完上述內(nèi)容,是不是對(duì)Java SimpleDateFormat線程的安全問題有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:JavaSimpleDateFormat線程的安全問題
文章源于:http://bm7419.com/article28/psdjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、App開發(fā)、建站公司定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)