SimpleDateFormat與DateTimeFormatter線程安全問題


SimpleDateFormat與DateTimeFormatter線程安全問題,參考阿里巴巴Java開發手冊規范處理

阿里巴巴開發手冊中這樣說的

20210716092541

多線程環境下:

public class MainClass {

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

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

    public static Date parse(String strDate) throws ParseException {
        return sdf.parse(strDate);
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 20; i++) {
            service.execute(() -> {
                try {
                    System.out.println(parse("2019-04-03 17:45:00"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }

            });
        }
        service.shutdown();
        service.awaitTermination(1, TimeUnit.DAYS);

    }
}

輸出情況:部分線程獲取失敗

image-20210716093350061

原因:把SimpleDateFormat定義為靜態變量,多線程環境下SimpleDateFormat的實例就會被多個線程共享,B線程會讀取到A線程的時間,就會出現時間差異和其他各種問題

SimpleDateFormat和它繼承的DateFormat都不是線程安全的

解決

使用JDK1.8的DateTimeFormatter

public class MainClass {

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public static String formatDate(LocalDateTime date) {
        return formatter.format(date);
    }

    public static LocalDateTime parse(String dateNow) throws ParseException {
        return LocalDateTime.parse(dateNow, formatter);
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 20; i++) {
            service.execute(() -> {
                try {
                    System.out.println(parse(formatDate(LocalDateTime.now())));
                } catch (ParseException e) {
                    e.printStackTrace();
                }

            });
        }
        service.shutdown();
        service.awaitTermination(1, TimeUnit.DAYS);
    }
}

因此進制在多線程的情況下使用SimpleDateFormat,多線程情況應該使用DateTimeFormatter

阿里JAVA開發手冊地址

手冊阿里雲盤鏈接:https://www.aliyundrive.com/s/MEtW4t5DdGh
————————————————
版權聲明:本文為CSDN博主「原棵」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_44750617/article/details/118785407


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM