您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“java中SimpleDateFormat線程不安全的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java中SimpleDateFormat線程不安全的示例分析”這篇文章吧。
類java.text.SimpleDateFormat主要負責日期的轉換與格式化。如:
編寫一個簡單的測試程序,如:
但是,在多線程的環境中,使用類java.text.SimpleDateFormat容易造成數據轉換及處理的不正確,因為該類并不是線程安全的。
我們可以從SimpleDateFormat類的javadoc描述中看到如下一句話:
Date formats are not synchronized.
It is recommended to create separate format instances for each thread.
If multiple threads access a format concurrently, it must be synchronized externally.
Date formats沒有同步。
建議為每一個線程創建獨立的format對象。
如果多個線程并發訪問一個format,那么,一定要在外部實現同步(synchronized)。
也就是說,在多線程下我們需要做些額外的保護措施,去保證其正確處理,否則是不安全的。接下來,讓我們一起來看一下,多線程中到底會發生什么?
線程不安全示例
運行結果主要包含如下幾個錯誤:
無異常,日期解析出現錯誤
有異常,java.lang.NumberFormatException
如,
再如,
那么問題來了,如何保證運行正常呢?
解決方法
其實,從SimpleDateFormat的javadoc中已經看到有處理的方法了。
Date formats are not synchronized.
It is recommended to create separate format instances for each thread.
If multiple threads access a format concurrently, it must be synchronized externally.
接下來,先從這個描述信息給出相關的解決方法。
(一)每次都新建SimpleDateFormat對象
改造SimpleDateFormatExample類,如:
執行上述Main.java類,得到正確結果:
(二) 訪問format時,添加synchronized
改造SimpleDateFormatExample類,如:
或者在使用format對象的方法前添加synchronized修飾,如:
同樣,執行上述Main.java類,可以得到正確結果:
(三)使用TheadLocal
改造SimpleDateFormatExample類,如:
同樣,執行上述Main.java類,可以得到正確結果:
(四)使用FastDateFormat
FastDateFormat類在Apache Common Langs包下面,
該類是線程安全的。
如果是Maven工程,其添加依賴包如下:
改造SimpleDateFormatExample類,如:
完整的類為:
同樣,執行上述Main.java類,可以得到正確結果:
(五)使用Joda Time
DateTimeFormatter 類Joda-Time包下面, 該類是線程安全的。
如果是Maven工程,其添加依賴包如下:
改造SimpleDateFormatExample類,如:
同樣,執行上述Main.java類,可以得到正確結果:
以上是“java中SimpleDateFormat線程不安全的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。