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

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

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

    ice world

    There is nothing too difficult if you put your heart into it.
    posts - 104, comments - 103, trackbacks - 0, articles - 0
    大致意思:Tim Cull碰到一個(gè)SimpleDateFormat帶來(lái)的嚴(yán)重的性能問(wèn)題,該問(wèn)題主要有SimpleDateFormat引發(fā),創(chuàng)建一個(gè) SimpleDateFormat實(shí)例的開(kāi)銷(xiāo)比較昂貴,解析字符串時(shí)間時(shí)頻繁創(chuàng)建生命周期短暫的實(shí)例導(dǎo)致性能低下。即使將 SimpleDateFormat定義為靜態(tài)類(lèi)變量,貌似能解決這個(gè)問(wèn)題,但是SimpleDateFormat是非線(xiàn)程安全的,同樣存在問(wèn)題,如果用 ‘synchronized’線(xiàn)程同步同樣面臨問(wèn)題,同步導(dǎo)致性能下降(線(xiàn)程之間序列化的獲取SimpleDateFormat實(shí)例)。

    Tim Cull使用Threadlocal解決了此問(wèn)題,對(duì)于每個(gè)線(xiàn)程SimpleDateFormat不存在影響他們之間協(xié)作的狀態(tài),為每個(gè)線(xiàn)程創(chuàng)建一個(gè)SimpleDateFormat變量的拷貝或者叫做副本,代碼如下:

     

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

    /** 
     * 使用ThreadLocal以空間換時(shí)間解決SimpleDateFormat線(xiàn)程安全問(wèn)題。 
     
    */

    public class DateUtil {
        
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
        @SuppressWarnings(
    "rawtypes")
        
    private static ThreadLocal threadLocal = new ThreadLocal() {
            
    protected synchronized Object initialValue() {
                
    return new SimpleDateFormat(DATE_FORMAT);
            }

        }
    ;

        
    public static DateFormat getDateFormat() {
            
    return (DateFormat) threadLocal.get();
        }


        
    public static Date parse(String textDate) throws ParseException {
            
    return getDateFormat().parse(textDate);
        }

    }


    創(chuàng)建一個(gè)ThreadLocal類(lèi)變量,這里創(chuàng)建時(shí)用了一個(gè)匿名類(lèi),覆蓋了initialValue方法,主要作用是創(chuàng)建時(shí)初始化實(shí)例。也可以采用下面方式創(chuàng)建;

    import java.text.DateFormat;
    import java.text.SimpleDateFormat;

    /** 
     * 使用ThreadLocal以空間換時(shí)間解決SimpleDateFormat線(xiàn)程安全問(wèn)題
     
    */

    public class DateUtil {    
        
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
        
    private static ThreadLocal threadLocal = new ThreadLocal();
        
    // 第一次調(diào)用get將返回null
        
    // 獲取線(xiàn)程的變量副本,如果不覆蓋initialValue,第一次get返回null,
        
    // 故需要初始化一個(gè)SimpleDateFormat,并set到threadLocal中
        public static DateFormat getDateFormat() {
            DateFormat df 
    = (DateFormat) threadLocal.get();
            
    if (df == null{
                df 
    = new SimpleDateFormat(DATE_FORMAT);  
                threadLocal.set(df);
            }

            
    return df;
        }

    }



    我們看下我們覆蓋的initialValue方法:

    protected T initialValue() {
        
    return null;    // 直接返回null
    }



    當(dāng)然也可以使用:
    apache commons-lang包的DateFormatUtils或者FastDateFormat實(shí)現(xiàn),apache保證是線(xiàn)程安全的,并且更高效。

    主站蜘蛛池模板: 亚洲人精品亚洲人成在线| 日韩毛片免费在线观看| 丝袜足液精子免费视频| 少妇亚洲免费精品| 人碰人碰人成人免费视频| 久久亚洲中文无码咪咪爱| 国产精品高清视亚洲一区二区| 亚洲最大成人网色| 亚洲黄色在线观看| 亚洲国产av高清无码| 亚洲第一网站免费视频| 久久亚洲国产精品成人AV秋霞| 亚洲AV日韩精品久久久久| 久久夜色精品国产亚洲AV动态图 | 亚洲精品精华液一区二区| 亚洲熟妇av一区| 亚洲国产日韩在线| 亚洲日韩精品国产3区| 亚洲色大成网站www永久网站| 久久亚洲国产最新网站| 亚洲精品中文字幕| 免费一级特黄特色大片| 人成午夜免费大片在线观看| 看成年女人免费午夜视频| 无码AV动漫精品一区二区免费| 一级**爱片免费视频| 两个人的视频www免费| 一级毛片免费播放| www.999精品视频观看免费| 成人毛片免费观看视频在线| 黄色免费网站网址| 国产大片线上免费看| 久久久久亚洲AV综合波多野结衣| 亚洲码国产精品高潮在线| 亚洲精品免费在线观看| 亚洲av成人一区二区三区| 国产成人va亚洲电影| 国产做国产爱免费视频| 67pao强力打造高清免费| 女人18毛片水真多免费播放| 日本xxwwxxww在线视频免费|