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

Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案

 更新時(shí)間:2020年07月06日 10:40:24   作者:BarryW  
這篇文章主要介紹了Java在并發(fā)環(huán)境中SimpleDateFormat多種解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

先來(lái)看一個(gè)多線程下使用例子,看到運(yùn)行結(jié)果會(huì)出現(xiàn)異常:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class SimpleDateFormateTest {
 
  public static void main(String[] args) {
    final DateFormat df = new SimpleDateFormat("yyyyMMdd,HHmmss");
    ExecutorService ts = Executors.newFixedThreadPool(100);
    for (;;) {
      ts.execute(new Runnable() {     
        @Override
        public void run() {
          try {
           //生成隨機(jī)數(shù),格式化日期
           String format = df.format(new Date(Math.abs(new Random().nextLong())));
           System.out.println(format);
          } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
          }
        }
      });
    }
  }  
}

運(yùn)行結(jié)果:

在并發(fā)環(huán)境下使用SimpleDateFormat,正常的打開(kāi)放式如下:

為了能夠在多線程環(huán)境下使用SimpleDateFormat,有這六種方法:

方法一

在需要執(zhí)行格式化的地方都新建SimpleDateFormat實(shí)例,使用局部變量來(lái)存放SimpleDateFormat實(shí)例

public static String formatDate(Date date)throws ParseException{
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 return sdf.format(date);
}

這種方法可能會(huì)導(dǎo)致短期內(nèi)創(chuàng)建大量的SimpleDateFormat實(shí)例,如解析一個(gè)excel表格里的字符串日期。

方法二

為了避免創(chuàng)建大量的SimpleDateFormat實(shí)例,往往會(huì)考慮把SimpleDateFormat實(shí)例設(shè)為靜態(tài)成員變量,共享SimpleDateFormat對(duì)象。這種情況下就得對(duì)SimpleDateFormat添加同步。

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

public static String formatDate(Date date)throws ParseException{
 synchronized(sdf){
  return sdf.format(date);
 } 
}

這種方法的缺點(diǎn)也很明顯,就是在高并發(fā)的環(huán)境下會(huì)導(dǎo)致解析被阻塞。

方法三 

方法加同步鎖synchronized,在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行類中的某個(gè)方法。

缺點(diǎn):性能較差,每次都要等待鎖釋放后其他線程才能進(jìn)入。

方案四 使用第三方包

這個(gè)我有嘗試cn.hutool和common-lang3提供的FastDateFormat
最后的結(jié)果其實(shí)并不滿意,因?yàn)檫@兩個(gè)包都沒(méi)能幫助我檢查非正常時(shí)間,比如2018-07-32這種日期也被認(rèn)為是正確的時(shí)期格式了

方法五(推薦)

要在高并發(fā)環(huán)境下能有比較好的體驗(yàn),可以使用ThreadLocal來(lái)限制SimpleDateFormat只能在線程內(nèi)共享,這樣就避免了多線程導(dǎo)致的線程安全問(wèn)題。

 private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
  @Override
  protected DateFormat initialValue() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  }
};

public static String format(Date date) {
  return threadLocal.get().format(date);
}

方案六 DateTimeFormatter使用

Java8提供了新的日期時(shí)間API,其中包括用于日期時(shí)間格式化的DateTimeFormatter,它與SimpleDateFormat的有什么區(qū)別呢?

問(wèn)題解決

兩者最大的區(qū)別是,Java8的DateTimeFormatter也是線程安全的,而SimpleDateFormat并不是線程安全。

解析日期

String dateStr= "2016年10月25日";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date= LocalDate.parse(dateStr, formatter);

日期轉(zhuǎn)換為字符串

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a");
String nowStr = now .format(format);

由DateTimeFormatter的靜態(tài)方法ofPattern()構(gòu)建日期格式,LocalDateTime和LocalDate等一些表示日期或時(shí)間的類使用parse和format方法把日期和字符串做轉(zhuǎn)換。

使用新的API,整個(gè)轉(zhuǎn)換過(guò)程都不需要考慮線程安全的問(wèn)題。

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

相關(guān)文章

  • java編寫(xiě)的文件管理器代碼分享

    java編寫(xiě)的文件管理器代碼分享

    本文給大家分享的是一則使用java編寫(xiě)的文件管理器的代碼,新人練手的作品,邏輯上還是有點(diǎn)小問(wèn)題,大家?guī)兔纯窗伞?/div> 2015-04-04
  • Spring Boot使用Druid連接池的示例代碼

    Spring Boot使用Druid連接池的示例代碼

    Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池。這篇文章主要介紹了Spring Boot使用Druid連接池的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • win10安裝JDK14.0.2的詳細(xì)安裝過(guò)程

    win10安裝JDK14.0.2的詳細(xì)安裝過(guò)程

    這篇文章主要介紹了win10安裝JDK14.0.2的詳細(xì)安裝過(guò)程的相關(guān)資料,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • spring boot整合RabbitMQ實(shí)例詳解(Fanout模式)

    spring boot整合RabbitMQ實(shí)例詳解(Fanout模式)

    這篇文章主要介紹了spring boot整合RabbitMQ的實(shí)例講解(Fanout模式),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列

    Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 大數(shù)組元素差異removeAll與Map效率對(duì)比

    大數(shù)組元素差異removeAll與Map效率對(duì)比

    這篇文章主要介紹了大數(shù)組元素差異removeAll與Map效率對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java ThreadLocal類使用詳解

    Java ThreadLocal類使用詳解

    這篇文章主要介紹了Java ThreadLocal類詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 淺析Java中內(nèi)部鎖和顯示鎖的使用

    淺析Java中內(nèi)部鎖和顯示鎖的使用

    在java中鎖主要兩類,內(nèi)部鎖synchronized和顯示鎖java.util.concurrent.locks.Lock,本文將來(lái)和大家聊聊這兩者的相關(guān)知識(shí),需要的可以參考一下
    2023-06-06
  • idea開(kāi)啟mybatis控制臺(tái)SQL日志打印的代碼示例

    idea開(kāi)啟mybatis控制臺(tái)SQL日志打印的代碼示例

    本文主要介紹了idea開(kāi)啟mybatis控制臺(tái)SQL日志打印的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • spring boot整合Shiro實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    spring boot整合Shiro實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    本篇文章主要介紹了spring boot整合Shiro實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論