<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人在线观看网站 | 亚洲人成亚洲人成在线观看| 国产精品免费看久久久香蕉| 亚洲成色999久久网站| 影音先锋在线免费观看| 99精品免费视品| 亚洲精品亚洲人成在线播放| 又黄又大又爽免费视频| 国产成人精品一区二区三区免费| 亚洲一区二区久久| 超清首页国产亚洲丝袜| 18禁免费无码无遮挡不卡网站 | 三年片在线观看免费观看高清电影| 亚洲伦另类中文字幕| 成人免费在线观看网站| 丝袜足液精子免费视频| 亚洲熟妇成人精品一区| 亚洲热线99精品视频| 永久免费视频v片www| 精品亚洲永久免费精品| 亚洲A∨精品一区二区三区下载| 亚洲精品国产精品乱码不99| 精品久久洲久久久久护士免费| 国产一区二区免费视频| 老湿机一区午夜精品免费福利| 亚洲欧洲日产韩国在线| 亚洲女久久久噜噜噜熟女| 四虎免费在线观看| 88xx成人永久免费观看| 亚洲免费一区二区| 亚洲av日韩av永久无码电影| 亚洲欧洲日韩综合| 国产V亚洲V天堂无码久久久| 日韩精品亚洲专区在线观看| 最近2019中文字幕免费看最新| 免费国产黄网站在线观看可以下载| 一个人看的免费观看日本视频www| 亚洲国产精品无码观看久久| 亚洲日本国产乱码va在线观看| 亚洲国产精彩中文乱码AV| 亚洲国产精品日韩|