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

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

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

    posts - 73,  comments - 55,  trackbacks - 0

    早在Java 1.2推出之時(shí),Java平臺(tái)中就引入了一個(gè)新的支持:java.lang.ThreadLocal,給我們在編寫多線程程序時(shí)提供了一種新的選擇。使用這個(gè)工具類可以很簡潔地編寫出優(yōu)美的多線程程序,雖然ThreadLocal非常有用,但是似乎現(xiàn)在了解它、使用它的朋友還不多。

    ThreadLocal是什么

    ThreadLocal并非是一個(gè)線程的本地實(shí)現(xiàn)版本,它并不是一個(gè)Thread,而是thread local variable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)其實(shí)的功用非常簡單,就是為每一個(gè)使用該變量的線程都提供一個(gè)變量值的副本,是每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)和其它線程的副本沖突。從線程的角度看,就好像每一個(gè)線程都完全擁有該變量。線程局部變量并不是Java的新發(fā)明,在其它的一些語言編譯器實(shí)現(xiàn)(如IBM XL FORTRAN)中,它在語言的層次提供了直接的支持。因?yàn)镴ava中沒有提供在語言層次的直接支持,而是提供了一個(gè)ThreadLocal的類來提供支持,所以,在Java中編寫線程局部變量的代碼相對比較笨拙,這也許是線程局部變量沒有在Java中得到很好的普及的一個(gè)原因吧。

    ThreadLocal的設(shè)計(jì)

    首先看看ThreadLocal的接口:

    Object get() ;

    // 返回當(dāng)前線程的線程局部變量副本 protected Object initialValue(); // 返回該線程局部變量的當(dāng)前線程的初始值

    void set(Object value);

    // 設(shè)置當(dāng)前線程的線程局部變量副本的值

    ThreadLocal有3個(gè)方法,其中值得注意的是initialValue(),該方法是一個(gè)protected的方法,顯然是為了子類重寫而特意實(shí)現(xiàn)的。該方法返回當(dāng)前線程在該線程局部變量的初始值,這個(gè)方法是一個(gè)延遲調(diào)用方法,在一個(gè)線程第1次調(diào)用get()或者set(Object)時(shí)才執(zhí)行,并且僅執(zhí)行1次。ThreadLocal中的確實(shí)實(shí)現(xiàn)直接返回一個(gè)null:

    protected Object initialValue() { return null; }

    ThreadLocal是如何做到為每一個(gè)線程維護(hù)變量的副本的呢?其實(shí)實(shí)現(xiàn)的思路很簡單,在ThreadLocal類中有一個(gè)Map,用于存儲(chǔ)每一個(gè)線程的變量的副本。比如下面的示例實(shí)現(xiàn):


    public class ThreadLocal
    {
    private Map values = Collections.synchronizedMap(new HashMap());
    public Object get()
    {
    Thread curThread = Thread.currentThread();
    Object o = values.get(curThread);
    if (o == null && !values.containsKey(curThread))
    {
    o = initialValue();
    values.put(curThread, o);
    }
    return o;
    }

    public void set(Object newValue)
    {
    values.put(Thread.currentThread(), newValue);
    }

    public Object initialValue()
    {
    return null;
    }
    }

    ?


    當(dāng)然,這并不是一個(gè)工業(yè)強(qiáng)度的實(shí)現(xiàn),但JDK中的ThreadLocal的實(shí)現(xiàn)總體思路也類似于此。

    ThreadLocal的使用

    如果希望線程局部變量初始化其它值,那么需要自己實(shí)現(xiàn)ThreadLocal的子類并重寫該方法,通常使用一個(gè)內(nèi)部匿名類對ThreadLocal進(jìn)行子類化,比如下面的例子,SerialNum類為每一個(gè)類分配一個(gè)序號(hào)


    public class SerialNum
    {
    // The next serial number to be assigned

    private static int nextSerialNum = 0;

    private static ThreadLocal serialNum = new ThreadLocal()
    {
    protected synchronized Object initialValue()
    {
    return new Integer(nextSerialNum++);
    }
    };


    public static int get()
    {
    return ((Integer) (serialNum.get())).intValue();
    }

    }

    ?


    SerialNum類的使用將非常地簡單,因?yàn)間et()方法是static的,所以在需要獲取當(dāng)前線程的序號(hào)時(shí),簡單地調(diào)用:

    int serial = SerialNum.get();

    即可。

    在線程是活動(dòng)的并且ThreadLocal對象是可訪問的時(shí),該線程就持有一個(gè)到該線程局部變量副本的隱含引用,當(dāng)該線程運(yùn)行結(jié)束后,該線程擁有的所以線程局部變量的副本都將失效,并等待垃圾收集器收集。

    ThreadLocal與其它同步機(jī)制的比較

    ThreadLocal和其它同步機(jī)制相比有什么優(yōu)勢呢?ThreadLocal和其它所有的同步機(jī)制都是為了解決多線程中的對同一變量的訪問沖突,在普通的同步機(jī)制中,是通過對象加鎖來實(shí)現(xiàn)多個(gè)線程對同一變量的安全訪問的。這時(shí)該變量是多個(gè)線程共享的,使用這種同步機(jī)制需要很細(xì)致地分析在什么時(shí)候?qū)ψ兞窟M(jìn)行讀寫,什么時(shí)候需要鎖定某個(gè)對象,什么時(shí)候釋放該對象的鎖等等很多。所有這些都是因?yàn)槎鄠€(gè)線程共享了資源造成的。ThreadLocal就從另一個(gè)角度來解決多線程的并發(fā)訪問,ThreadLocal會(huì)為每一個(gè)線程維護(hù)一個(gè)和該線程綁定的變量的副本,從而隔離了多個(gè)線程的數(shù)據(jù),每一個(gè)線程都擁有自己的變量副本,從而也就沒有必要對該變量

    posted on 2006-12-27 21:37 保爾任 閱讀(338) 評論(0)  編輯  收藏 所屬分類: J2SE

    <2006年12月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: MM131亚洲国产美女久久| 成年网站免费视频A在线双飞| 日本不卡在线观看免费v| 亚洲国产精品无码久久久| 114级毛片免费观看| 亚洲综合区图片小说区| 亚洲成人免费网址| 亚洲区精品久久一区二区三区| 91手机看片国产永久免费| 亚洲欧洲在线播放| 最近2019中文字幕免费看最新| 精品国产日韩久久亚洲| 在线观看免费精品国产| 美女视频黄a视频全免费网站色 | 亚洲色无码国产精品网站可下载| 波多野结衣免费在线| 无码亚洲成a人在线观看| 亚洲国产精品成人一区| 巨胸喷奶水视频www免费视频| 亚洲成a人片77777kkkk| 6080午夜一级毛片免费看| 亚洲av永久无码精品三区在线4 | 成在线人视频免费视频| 亚洲一区二区三区首页| 午夜国产精品免费观看| 国产亚洲人成在线影院| 精品亚洲综合久久中文字幕| 91大神免费观看| 亚洲色大成WWW亚洲女子| 亚洲熟女乱综合一区二区| 国产成人久久AV免费| 在线精品亚洲一区二区| 中文字幕日韩亚洲| 亚洲精品免费网站| 成人免费网站视频www| 91精品国产亚洲爽啪在线观看| 四虎影视www四虎免费| 国产成人无码精品久久久久免费 | 激情内射亚洲一区二区三区| 国产成人免费爽爽爽视频 | 精品熟女少妇av免费久久|