小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

[細品java]ThreadLocal源碼學(xué)習(xí)

 昵稱10504424 2016-01-07

ThreadLocal是線程局部變量,其中保存了特定于該線程的值.每個線程都擁有一份獨立的副本值,即每個線程修改變量值不影響其他線程該變量的副本值.這些特定于線程的值保存在Thread對象中,當(dāng)線程終止后,這些值會作為垃圾回收.
如果沒有看源碼可能會認(rèn)為ThreadLocal內(nèi)部的實現(xiàn)方式應(yīng)該是采用Map容器,保存一個的映射關(guān)系.然而JDK內(nèi)部并不是這么實現(xiàn)的,而是在Thread類中加入了一個散列表(ThreadLocalMap是ThreadLocal的靜態(tài)內(nèi)部類)來維護當(dāng)前線程的所有局部變量值(即當(dāng)前線程中的所有ThreadLocal變量),通過散列表數(shù)據(jù)結(jié)構(gòu)可以快速地執(zhí)行g(shù)et和set操作.

散列

每次創(chuàng)建的ThreadLocal都有唯一的hashCode值,根據(jù)這個值hashCode可以計算變量在散列表中對應(yīng)的地址.ThreadLocalMap的hash函數(shù)方法是將hashCode值和散列表容量大小進行與操作得到變量對應(yīng)的位置.

int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);

沖突解決

在散列表中會存在地址沖突問題,即對于不同的hashCode可能會計算得到相同地址.對于這種情況,ThreadLocalMap采用了最簡單的沖突解決方案---從沖突發(fā)生的地址d開始,依次探測d的下一個地址,直到找到一個空閑單元為止.

裝填因子

ThreadLocalMap 設(shè)置的裝填因子為2/3,當(dāng)變量個數(shù)大于2/3時擴大容器容量再散列.

get和set

ThreadLocal的定義和使用比較簡單,只要聲明一個ThreadLocal變量,那該變量就為每個線程都分配了一個副本.通過set和get方法設(shè)置和獲取該線程局部變量值:

ThreadLocal<Integer> integerLocal = new ThreadLocal<Integer>();
integerLocal.set(1);
Integer i = integerLocal.get();

對于以上的set和get方法的實現(xiàn)思路也比較簡單.在set方法中,首先查看當(dāng)前線程是否初始化了散列表,如果沒有則創(chuàng)建一個散列表(初始化容器大小為16).如果存在則根據(jù)hashCode計算變量在散列表的地址并設(shè)置值.

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

get方法和set方法相似,如果散列表不存在時則創(chuàng)建一個散列表并設(shè)置初始值.

public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
 }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多