您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“java中SimpleDateFormat線程不安全的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java中SimpleDateFormat線程不安全的示例分析”這篇文章吧。
類(lèi)java.text.SimpleDateFormat主要負(fù)責(zé)日期的轉(zhuǎn)換與格式化。如:
編寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試程序,如:
但是,在多線程的環(huán)境中,使用類(lèi)java.text.SimpleDateFormat容易造成數(shù)據(jù)轉(zhuǎn)換及處理的不正確,因?yàn)樵擃?lèi)并不是線程安全的。
我們可以從SimpleDateFormat類(lèi)的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沒(méi)有同步。
建議為每一個(gè)線程創(chuàng)建獨(dú)立的format對(duì)象。
如果多個(gè)線程并發(fā)訪問(wèn)一個(gè)format,那么,一定要在外部實(shí)現(xiàn)同步(synchronized)。
也就是說(shuō),在多線程下我們需要做些額外的保護(hù)措施,去保證其正確處理,否則是不安全的。接下來(lái),讓我們一起來(lái)看一下,多線程中到底會(huì)發(fā)生什么?
線程不安全示例
運(yùn)行結(jié)果主要包含如下幾個(gè)錯(cuò)誤:
無(wú)異常,日期解析出現(xiàn)錯(cuò)誤
有異常,java.lang.NumberFormatException
如,
再如,
那么問(wèn)題來(lái)了,如何保證運(yùn)行正常呢?
解決方法
其實(shí),從SimpleDateFormat的javadoc中已經(jīng)看到有處理的方法了。
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.
接下來(lái),先從這個(gè)描述信息給出相關(guān)的解決方法。
(一)每次都新建SimpleDateFormat對(duì)象
改造SimpleDateFormatExample類(lèi),如:
執(zhí)行上述Main.java類(lèi),得到正確結(jié)果:
(二) 訪問(wèn)format時(shí),添加synchronized
改造SimpleDateFormatExample類(lèi),如:
或者在使用format對(duì)象的方法前添加synchronized修飾,如:
同樣,執(zhí)行上述Main.java類(lèi),可以得到正確結(jié)果:
(三)使用TheadLocal
改造SimpleDateFormatExample類(lèi),如:
同樣,執(zhí)行上述Main.java類(lèi),可以得到正確結(jié)果:
(四)使用FastDateFormat
FastDateFormat類(lèi)在Apache Common Langs包下面,
該類(lèi)是線程安全的。
如果是Maven工程,其添加依賴(lài)包如下:
改造SimpleDateFormatExample類(lèi),如:
完整的類(lèi)為:
同樣,執(zhí)行上述Main.java類(lèi),可以得到正確結(jié)果:
(五)使用Joda Time
DateTimeFormatter 類(lèi)Joda-Time包下面, 該類(lèi)是線程安全的。
如果是Maven工程,其添加依賴(lài)包如下:
改造SimpleDateFormatExample類(lèi),如:
同樣,執(zhí)行上述Main.java類(lèi),可以得到正確結(jié)果:
以上是“java中SimpleDateFormat線程不安全的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。