关于SimpleDateFormat线程不安全的源码分析
生活随笔
收集整理的這篇文章主要介紹了
关于SimpleDateFormat线程不安全的源码分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SimpleDateFormat,線程不安全,源碼分析
1、先看SimpleDateFormat類圖
SimpleDateFormat繼承了DateFormat
DateFormat中有個成員變量是Calendar,這個先記住,線程不安全主要就是因為這個成員變量
2、看下圖SimpleDateFormat的parse方法
這個方法,主要就兩步,
第一步是針對入參text做了一系列操作,這里可以省略不看
第二步就是下圖代碼中的紅框部分:calb.establish(calendar),這個入參就是上面說的
SimpleDateFormat的常成員變量
3、看下圖,calb.establish(calendar)方法的實現
圖中的三步,都不是線程安全的,因為入參cal是SimpleDateFormat的成員變量
當多個線程同時操作一個SimpleDateFormat的時候,SimpleDateFormat中的Calendar屬性也就會被多個線程拿到,那么下面這三步就可能因為多個線程同時執行而亂掉
具體測試代碼
我們用多個線程,同時操作SimpleDateFormat的parse方法,如果把SimpleDateFormat放在成員變量上,就會大概率報錯,因為此時SimpleDateFormat會被多個線程同時使用。
解決方法有很多,最常見的就是在每次用SimpleDateFormat的時候都重新new一個。
由于線程不安全,常見的錯誤如下:
Exception in thread "pool-1-thread-3" Exception in thread "pool-1-thread-1" java.lang.NumberFormatException: multiple pointsat sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1890)at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)at java.lang.Double.parseDouble(Double.java:538)at java.text.DigitList.getDouble(DigitList.java:169)at java.text.DecimalFormat.parse(DecimalFormat.java:2089)at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)at java.text.DateFormat.parse(DateFormat.java:364)at com.zs.qunfx.simpleDateFormat.MainTest.unSafeParse(MainTest.java:27)at com.zs.qunfx.simpleDateFormat.MainTest$1.run(MainTest.java:51)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748) Exception in thread "pool-1-thread-8" java.lang.NumberFormatException: For input string: ""at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Long.parseLong(Long.java:601)at java.lang.Long.parseLong(Long.java:631)at java.text.DigitList.getLong(DigitList.java:195)at java.text.DecimalFormat.parse(DecimalFormat.java:2084)at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2162)at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)at java.text.DateFormat.parse(DateFormat.java:364)at com.zs.qunfx.simpleDateFormat.MainTest.unSafeParse(MainTest.java:27)at com.zs.qunfx.simpleDateFormat.MainTest$1.run(MainTest.java:51)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)總結
以上是生活随笔為你收集整理的关于SimpleDateFormat线程不安全的源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外设驱动库开发笔记30:宇电AI-BUS
- 下一篇: WinSock I/O 模型 -- WS