<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帶來的嚴(yán)重的性能問題,該問題主要有SimpleDateFormat引發(fā),創(chuàng)建一個(gè) SimpleDateFormat實(shí)例的開銷比較昂貴,解析字符串時(shí)間時(shí)頻繁創(chuàng)建生命周期短暫的實(shí)例導(dǎo)致性能低下。即使將 SimpleDateFormat定義為靜態(tài)類變量,貌似能解決這個(gè)問題,但是SimpleDateFormat是非線程安全的,同樣存在問題,如果用 ‘synchronized’線程同步同樣面臨問題,同步導(dǎo)致性能下降(線程之間序列化的獲取SimpleDateFormat實(shí)例)。

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

     

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

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

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

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

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

    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
        
    // 獲取線程的變量副本,如果不覆蓋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保證是線程安全的,并且更高效。

    主站蜘蛛池模板: 亚洲人成网站在线在线观看| 永久免费无码网站在线观看个| 无码少妇一区二区浪潮免费| 亚洲乱码av中文一区二区| 亚洲国产精品成人网址天堂| 99久9在线|免费| 国产亚洲精品第一综合| 亚洲av永久无码精品表情包| 无码高潮少妇毛多水多水免费| 四虎精品免费永久免费视频| 亚洲另类春色校园小说| 亚洲国产成人久久综合野外| 国产在线jyzzjyzz免费麻豆| 日韩一级片免费观看| 91亚洲国产成人久久精品网址 | 日韩精品成人无码专区免费| 一级特黄aaa大片免费看| 久久亚洲AV成人无码| 免费成人av电影| 国产精品1024永久免费视频| 一级毛片不卡免费看老司机| 亚洲人成77777在线观看网| 精品国产亚洲一区二区三区| 国产精品免费_区二区三区观看| 久久久久久影院久久久久免费精品国产小说 | 一日本道a高清免费播放 | 五月婷婷免费视频| 亚洲中文无码a∨在线观看| 中文字幕亚洲天堂| 在线观看无码的免费网站| 久久青草免费91线频观看不卡 | 亚洲精品无码日韩国产不卡av| 亚洲av综合色区| 亚洲乱码日产精品a级毛片久久| 日韩av无码成人无码免费| 一级毛片免费毛片一级毛片免费 | 日韩毛片无码永久免费看| **俄罗斯毛片免费| 曰批全过程免费视频在线观看无码| 青青视频免费在线| 亚洲中文字幕乱码一区|