久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 昵稱10504424 2016-01-07

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

散列

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

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

沖突解決

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

裝填因子

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

get和set

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

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

對(duì)于以上的set和get方法的實(shí)現(xiàn)思路也比較簡(jiǎn)單.在set方法中,,首先查看當(dāng)前線程是否初始化了散列表,,如果沒(méi)有則創(chuàng)建一個(gè)散列表(初始化容器大小為16).如果存在則根據(jù)hashCode計(jì)算變量在散列表的地址并設(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方法相似,如果散列表不存在時(shí)則創(chuàng)建一個(gè)散列表并設(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();
 }

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多