成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:2日期:2022-08-29 16:10:08

先來看一個多線程下使用例子,看到運行結果會出現(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() { @Overridepublic void run() { try { //生成隨機數(shù),格式化日期 String format = df.format(new Date(Math.abs(new Random().nextLong()))); System.out.println(format); } catch (Exception e) { e.printStackTrace(); System.exit(1); }} }); } } }

運行結果:

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

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

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

方法一

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

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

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

方法二

為了避免創(chuàng)建大量的SimpleDateFormat實例,往往會考慮把SimpleDateFormat實例設為靜態(tài)成員變量,共享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); } }

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

方法三 

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

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

方案四 使用第三方包

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

方法五(推薦)

要在高并發(fā)環(huán)境下能有比較好的體驗,可以使用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的有什么區(qū)別呢?

問題解決

兩者最大的區(qū)別是,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的靜態(tài)方法ofPattern()構建日期格式,LocalDateTime和LocalDate等一些表示日期或時間的類使用parse和format方法把日期和字符串做轉換。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产午夜视频 | 欧美日韩国产58香蕉在线视频 | 欧美福利一区二区三区 | 久久老司机波多野结衣 | 日韩欧美国产另类 | 永久免费观看午夜视频在线 | 亚洲午夜精品一级在线播放放 | 亚洲人成在线播放网站岛国 | 欧美顶级毛片在线播放小说 | 成人国产亚洲欧美成人综合网 | 在线精品欧美日韩 | 日本在线毛片视频免费看 | 久久99亚洲精品久久99 | 国产黄色三级 | 亚洲男人的天堂视频 | 中文精品久久久久国产不卡 | 日本成人不卡视频 | 国产三级全黄 | 黄色理论视频 | 在线观看99| 日韩 欧美 中文 亚洲 高清 在线 | 欧美一级高清视频在线播放 | 美女操穴视频 | 国产精品亚洲精品 | 伊人久热这里只有精品视频99 | 操操综合网 | 成人满18在线观看网站免费 | 韩国一级a毛片 | 99av在线| 日韩一区二区三区视频在线观看 | 国产精品九九 | 国产日比视频 | 香蕉久久成人网 | 亚洲三及片 | 国产中文久久精品 | 日韩精品免费视频 | 国产成人爱片免费观看视频 | 亚洲一片 | 亚洲高清在线视频 | 国产第一区二区三区在线观看 | 欧美综合在线视频 |