<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    leisure

    JAVA - exceed,helloworld
    隨筆 - 50, 文章 - 0, 評論 - 11, 引用 - 0
    數據加載中……

    SimpleDateFormat多線程并發下的不安全隱患

    最近偶然發現一些數據的日期有錯亂,而且時間出錯格式無規律,有些去了1970年了,有些月份錯了,有些號數變了,而日志上看并沒有異常信息!

    根據用戶反應,常出現在某個批量更新操作中,于是乎,也按照用戶描述的,線下操作了數遍,也沒有出現這種情況。

    有趣的是,就算在線上操作,也并不是一定會出現這種問題,只是偶然!

    我開始懷疑底層代碼問題了,因為那個操作,并沒有修改到日期相關的字段,為了證實這點,經過我一番的排查,
    問題終于定位在DateUtil.parse等方法上,parse方法調用了一個靜態的simpleDateFormat.parse方法,為什么?!為什么這個方法不穩定的?
    仔細閱讀了java.util.SimpleDateFormat的api,發現此信息:

    Synchronization

    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并不是線程同步的,以致并發的時候不安全!為了證實這點于是乎寫了一個簡單的測試程序。

    package com.leisure;
    import java.text.ParseException;
    public class TestSimpleDateFormatThreadSafe extends Thread {
        @Override
        public void run() {
            while(true) {
                try {
                    this.join(2000);
                } 
    catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                try {
                    System.out.println(DateUtil.parse(
    "2011-10-11 06:02:20"));
                } 
    catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }

        public static void main(String[] args) {
            for(int i = 0; i < 20; i++)
                new TestSimpleDateFormatThreadSafe().start();
        }
    }

    package com.leisure;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    public class DateUtil {
        
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

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

    輸出結果:

    Tue Oct 11 18:02:20 CST 2011

    Tue Oct 11 18:02:20 CST 2011

    Sun Oct 11 18:02:20 CST 1970

    Tue Oct 11 18:02:20 CST 2011

    Thu Jan 01 18:02:20 CST 1970

    Sat Dec 11 18:02:20 CST 2010

    Tue Oct 11 18:02:20 CST 2011

    Exception in thread "Thread-18" java.lang.NumberFormatException: multiple points

    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)

    at java.lang.Double.parseDouble(Unknown Source)

    at java.text.DigitList.getDouble(Unknown Source)

    at java.text.DecimalFormat.parse(Unknown Source)

    at java.text.SimpleDateFormat.subParse(Unknown Source)

    at java.text.SimpleDateFormat.parse(Unknown Source)

    at java.text.DateFormat.parse(Unknown Source)

    at com.leisure.DateUtil.parse(DateUtil.java:12)

    at com.leisure.TestSimpleDateFormatThreadSafe.run(TestSimpleDateFormatThreadSafe.java:16)

    Fri Dec 23 19:02:20 CST 2011

    Fri Dec 23 18:02:20 CST 2011

    輸出結果很明顯了,跟線上數據出現的問題基本一致。不過按照這里看到的結果,有報錯,再仔細閱讀了應用的底層代碼,
    某個位置攔截了部份異常,沒有記錄也沒有向上拋出處理,到這里,我只想問一句:底層代碼誰寫的?

    posted on 2011-10-15 00:22 leisure 閱讀(2872) 評論(0)  編輯  收藏 所屬分類: java

    主站蜘蛛池模板: 亚洲国产小视频精品久久久三级| 亚洲欧美日韩中文二区| 免费在线观看日韩| 久草免费在线观看视频| 花蝴蝶免费视频在线观看高清版 | 亚洲三级在线观看| 国产亚洲精品va在线| 免费人成网站在线高清| 蜜桃视频在线观看免费网址入口| 无码精品国产一区二区三区免费 | 成人免费无毒在线观看网站| 国产高清不卡免费视频| 精品久久久久久无码免费| 精品国产亚洲第一区二区三区| 亚洲中文无码a∨在线观看| 亚洲av无码国产精品色午夜字幕| 国产偷窥女洗浴在线观看亚洲| 免费一级毛片在线观看| 欧洲精品免费一区二区三区| 国产无人区码卡二卡三卡免费| 亚洲人成影院在线无码按摩店| 免费看小12萝裸体视频国产| 麻豆国产人免费人成免费视频| 最近最好的中文字幕2019免费| 亚洲高清中文字幕免费| 国产精品永久免费10000| 4444www免费看| 18级成人毛片免费观看| 99爱免费观看视频在线| 一区二区三区观看免费中文视频在线播放| 免费在线观影网站| 黄网站色视频免费在线观看的a站最新| 国产无遮挡又黄又爽免费网站| 国产中文字幕在线免费观看| 十八禁视频在线观看免费无码无遮挡骂过| 无码的免费不卡毛片视频| 日韩精品无码永久免费网站| jzzjzz免费观看大片免费| 成在线人视频免费视频| 丁香花在线视频观看免费| 久久青草91免费观看|