91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決Java在并發環境中SimpleDateFormat的異常

發布時間:2020-07-07 14:13:41 來源:億速云 閱讀:414 作者:清晨 欄目:開發技術

這篇文章主要介紹如何解決Java在并發環境中SimpleDateFormat的異常,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

先來看一個多線程下使用例子,看到運行結果會出現異常:

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 {
           //生成隨機數,格式化日期
           String format = df.format(new Date(Math.abs(new Random().nextLong())));
           System.out.println(format);
          } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
          }
        }
      });
    }
  }  
}

運行結果:

如何解決Java在并發環境中SimpleDateFormat的異常

在并發環境下使用SimpleDateFormat,正常的打開放式如下:

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

方法一

在需要執行格式化的地方都新建SimpleDateFormat實例,使用局部變量來存放SimpleDateFormat實例

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

這種方法可能會導致短期內創建大量的SimpleDateFormat實例,如解析一個excel表格里的字符串日期。

方法二

為了避免創建大量的SimpleDateFormat實例,往往會考慮把SimpleDateFormat實例設為靜態成員變量,共享SimpleDateFormat對象。這種情況下就得對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);
 } 
}

這種方法的缺點也很明顯,就是在高并發的環境下會導致解析被阻塞。

方法三 

方法加同步鎖synchronized,在同一時刻,只有一個線程可以執行類中的某個方法。

缺點:性能較差,每次都要等待鎖釋放后其他線程才能進入。

方案四 使用第三方包

這個我有嘗試cn.hutool和common-lang3提供的FastDateFormat
最后的結果其實并不滿意,因為這兩個包都沒能幫助我檢查非正常時間,比如2018-07-32這種日期也被認為是正確的時期格式了

方法五(推薦)

要在高并發環境下能有比較好的體驗,可以使用ThreadLocal來限制SimpleDateFormat只能在線程內共享,這樣就避免了多線程導致的線程安全問題。

 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提供了新的日期時間API,其中包括用于日期時間格式化的DateTimeFormatter,它與SimpleDateFormat的有什么區別呢?

問題解決

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

解析日期

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

日期轉換為字符串

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

由DateTimeFormatter的靜態方法ofPattern()構建日期格式,LocalDateTime和LocalDate等一些表示日期或時間的類使用parse和format方法把日期和字符串做轉換。

使用新的API,整個轉換過程都不需要考慮線程安全的問題。

以上是如何解決Java在并發環境中SimpleDateFormat的異常的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

英德市| 扬州市| 林周县| 湟中县| 华亭县| 鄂托克旗| 图木舒克市| 九龙坡区| 大竹县| 长垣县| 南陵县| 青岛市| 社会| 平顺县| 美姑县| 湄潭县| 建瓯市| 新营市| 淮安市| 承德市| 罗定市| 扶风县| 四子王旗| 偃师市| 三江| 基隆市| 奈曼旗| 汝南县| 永顺县| 贡觉县| 台北县| 蒙阴县| 闸北区| 东至县| 张家口市| 崇明县| 汾西县| 深州市| 甘孜| 甘肃省| 界首市|