最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?SimpleDateFormat線程不安全問題

 更新時間:2023年03月24日 15:32:00   作者:堅持與努力  
這篇文章詳細介紹了如可解決impleDateFormat線程不安全的問題,對多線程問題感興趣的同學(xué)可以參考閱讀本文

多線程 ——SimpleDateFormat

public class DateTest {
    //工具類中的日期組件
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(10));
        for (int i = 0; i < 100; i++) {
            threadPoolExecutor.execute(() -> {
                String dateString = sdf.format(new Date());
                try {
                    Date parseDate = sdf.parse(dateString);
                    String dateString2 = sdf.format(parseDate);
                    System.out.println(dateString.equals(dateString2));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    }
}

結(jié)果

原因分析

全局變量的SimpleDateFormat,在并發(fā)情況下,存在安全性問題。

我們通過源碼看下:

SimpleDateFormat繼承了 DateFormat

DateFormat類中維護了一個全局的Calendar變量

sdf.parse(dateStr)和sdf.format(date),都是由Calendar引用來儲存的。

如果SimpleDateFormat是static全局共享的,Calendar引用也會被共享。

又因為Calendar內(nèi)部并沒有線程安全機制,所以全局共享的SimpleDateFormat不是線性安全的。

解決方法

解決方法1

「FastDateFormat(FastDateFormat能保證線程安全) 替換 SimpleDateFormat」

private static final FastDateFormat sdf = FastDateFormat.getInstance(“yyyy-MM-dd HH:mm:ss”);

 測試代碼如下所示:

public class DateTest {
    //工具類中的日期組件
//    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private static final FastDateFormat sdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(10));
        for (int i = 0; i < 100; i++) {
            threadPoolExecutor.execute(() -> {
                String dateString = sdf.format(new Date());
                try {
                    Date parseDate = sdf.parse(dateString);
                    String dateString2 = sdf.format(parseDate);
                    System.out.println(dateString.equals(dateString2));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        threadPoolExecutor.shutdown();
    }
}

打印結(jié)果:

解決方法2

「使用DateTimeFormatter(DateTimeFormatter是線程安全的,java 8+支持)代替SimpleDateFormat」

private static DateTimeFormatter sdf = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);

測試代碼如下:

public class DateTest {
//工具類中的日期組件
// private static final SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
private static DateTimeFormatter sdf = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);

// private static final FastDateFormat sdf = FastDateFormat.getInstance(“yyyy-MM-dd HH:mm:ss”);

public static void main(String[] args) throws Exception {
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(10));
    for (int i = 0; i < 100; i++) {
        threadPoolExecutor.execute(() -> {
            try {
                String dateString = sdf.format(LocalDateTime.now());
                TemporalAccessor temporalAccessor = sdf.parse(dateString);
                String dateString2 = sdf.format(temporalAccessor);
                System.out.println(dateString.equals(dateString2));
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
    threadPoolExecutor.shutdown();
}

}
打印結(jié)果如下:

總結(jié)

在多線程中使用全局變量時一定要考慮到線程安全問題,若不確定是否存在線程安全問題的公共變量,則不要冒然使用,可以做一些測試和資料分析,或者使用局部變量。

到此這篇關(guān)于Java SimpleDateFormat線程不安全問題的文章就介紹到這了,更多相關(guān)SimpleDateFormat線程不安全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java啟動時自定義配置文件路徑,自定義log4j2.xml位置方式

    java啟動時自定義配置文件路徑,自定義log4j2.xml位置方式

    這篇文章主要介紹了java啟動時自定義配置文件路徑,自定義log4j2.xml位置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java實現(xiàn)數(shù)據(jù)脫敏(Desensitization)的操作指南

    Java實現(xiàn)數(shù)據(jù)脫敏(Desensitization)的操作指南

    數(shù)據(jù)脫敏是指通過對敏感數(shù)據(jù)進行部分或完全隱藏處理,保護敏感信息在存儲和使用過程中的安全性,常見的應(yīng)用場景包括日志記錄、接口返回、報表展示、數(shù)據(jù)分析等,本文給大家介紹了Java實現(xiàn)數(shù)據(jù)脫敏(Desensitization)的操作指南,需要的朋友可以參考下
    2025-02-02
  • 用C++實現(xiàn)求N!中末尾0的個數(shù)的方法詳解

    用C++實現(xiàn)求N!中末尾0的個數(shù)的方法詳解

    這篇文章主要介紹了用C++實現(xiàn)求N!中末尾0的個數(shù)的方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java中try catch 的基本用法示例

    Java中try catch 的基本用法示例

    這篇文章主要給大家介紹了關(guān)于Java中try catch 的基本用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • java開源區(qū)塊鏈jdchain入門

    java開源區(qū)塊鏈jdchain入門

    這篇文章主要介紹了java開源區(qū)塊鏈jdchain入門,文中為大家講解了關(guān)于部署及組件遇到的一些問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 一篇文章帶你搞定JAVA內(nèi)存泄漏

    一篇文章帶你搞定JAVA內(nèi)存泄漏

    今天小編就為大家分享一篇關(guān)于Java內(nèi)存泄漏問題處理方法經(jīng)驗總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-07-07
  • 詳細分析Java 泛型的使用

    詳細分析Java 泛型的使用

    這篇文章主要介紹了Java 泛型的使用,文中講解非常詳細,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • SpringCloud服務(wù)接口調(diào)用OpenFeign及使用詳解

    SpringCloud服務(wù)接口調(diào)用OpenFeign及使用詳解

    這篇文章主要介紹了SpringCloud服務(wù)接口調(diào)用——OpenFeign,在學(xué)習(xí)Ribbon時,服務(wù)間調(diào)用使用的是RestTemplate+Ribbon實現(xiàn),而Feign在此基礎(chǔ)上繼續(xù)進行了封裝,使服務(wù)間調(diào)用變得更加方便,需要的朋友可以參考下
    2023-04-04
  • Java反射設(shè)置/獲取對象屬性值三種方式

    Java反射設(shè)置/獲取對象屬性值三種方式

    這篇文章主要給大家介紹了關(guān)于Java反射設(shè)置/獲取對象屬性值的三種方式,反射機制的用途非常多,比如獲取方法,屬性名和屬性值等,甚至可以獲取標(biāo)簽等標(biāo)簽屬性,需要的朋友可以參考下
    2023-11-11
  • 解決JPA?save()方法null值覆蓋掉mysql預(yù)設(shè)的默認值問題

    解決JPA?save()方法null值覆蓋掉mysql預(yù)設(shè)的默認值問題

    這篇文章主要介紹了解決JPA?save()方法null值覆蓋掉mysql預(yù)設(shè)的默認值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

宜丰县| 华阴市| 乌兰察布市| 郧西县| 博野县| 墨玉县| 千阳县| 泊头市| 嘉黎县| 南投市| 秀山| 萨嘎县| 略阳县| 怀仁县| 桃源县| 龙游县| 云浮市| 华安县| 高安市| 林周县| 德阳市| 金寨县| 新巴尔虎左旗| 舟山市| 章丘市| 调兵山市| 南丹县| 阿坝| 瓦房店市| 昌乐县| 四平市| 台南市| 道真| 西充县| 庆元县| 新闻| 关岭| 南宁市| 根河市| 浏阳市| 封丘县|