最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中ThreadLocal和ThreadLocalMap淺析

 更新時(shí)間:2023年09月26日 10:28:51   作者:20481024  
這篇文章主要介紹了java中ThreadLocal和ThreadLocalMap淺析,ThreadLocal類用來設(shè)置線程私有變量?本身不儲(chǔ)存值?主要提供自身引用?和?操作ThreadLocalMap?屬性值得方法,需要的朋友可以參考下

ThreadLocal和ThreadLocalMap

先發(fā)一個(gè)最常見的圖

在這里插入圖片描述

關(guān)鍵字 ThreadLocal ThreadLocalMap Thread

1 概念 ThreadLocal

在這里插入圖片描述

理解:ThreadLocal類用來設(shè)置線程私有變量 本身不儲(chǔ)存值 主要提供自身引用 和 操作ThreadLocalMap 屬性值得方法,使用ThreadLocal會(huì)通過ThreadLocal的引用定位到到堆中Thread的類ThreadLocalMap里散列表里的值 從而達(dá)到線程私有

目的:解決多線程使用共享對象的問題 空間換時(shí)間

2 存儲(chǔ)形式

ThreadLocalMap(ThreadLocal 的靜態(tài)內(nèi)部類 由ThreadLocal類來維護(hù)和創(chuàng)建)中

a:和普通Hashmap類似存儲(chǔ)在一個(gè)數(shù)組內(nèi),但與hashmap使用的拉鏈法解決散列沖突的是 ThreadLocalMap使用開放地址法 //開放地址法缺點(diǎn) : -空間利用率低 開發(fā)地址發(fā)會(huì)在散列沖突時(shí)尋找下一個(gè)可存入的槽點(diǎn) 為了避免沖突 負(fù)載因子會(huì)設(shè)置的相對較小 還使用的原因是 ThreadLocalMap的散列值均勻 且經(jīng)常增刪 純數(shù)組較方便 節(jié)點(diǎn)數(shù)量少 時(shí)也能節(jié)省掉指針域帶來的空間開銷

b : 數(shù)組 初始容量16,負(fù)載因子2/3

c : node節(jié)點(diǎn) 的key封裝了WeakReference 用于回收

d : 數(shù)組位置計(jì)算

ThreadLocalMap屬性

        static class Entry extends WeakReference<ThreadLocal<?>> {
            Object value;
            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
        //初始容量16
        private static final int INITIAL_CAPACITY = 16;
        //散列表
        private Entry[] table;
        //entry 有效數(shù)量 
        private int size = 0;
        //負(fù)載因子
        private int threshold; 

ThreadLocalMap設(shè)置ThreadLocal 變量

    private void set(ThreadLocal<?> key, Object value) {
            Entry[] tab = table;
            int len = tab.length;
            //與運(yùn)算  & (len-1) 這就是為什么 要求數(shù)組len 要求2的n次冪 
            //因?yàn)閘en減一后最后一個(gè)bit是1 與運(yùn)算計(jì)算出來的數(shù)值下標(biāo) 能保證全覆蓋 
            //否者數(shù)組有效位會(huì)減半 
            //如果是hashmap 計(jì)算完下標(biāo)后 會(huì)增加鏈表 或紅黑樹的查找計(jì)算量 
            int i = key.threadLocalHashCode & (len-1);
            // 從下標(biāo)位置開始向后循環(huán)搜索  不會(huì)死循環(huán)  有擴(kuò)容因子 必定有空余槽點(diǎn)
            for (Entry e = tab[i];   e != null;  e = tab[i = nextIndex(i, len)]) {
                ThreadLocal<?> k = e.get();
                //一種情況 是當(dāng)前引用 返回值
                if (k == key) {
                    e.value = value;
                    return;
                }
                //槽點(diǎn)被GC掉 重設(shè)狀態(tài) 
                if (k == null) {
                    replaceStaleEntry(key, value, i);
                    return;
                }
            }
			//槽點(diǎn)為空 設(shè)置value
            tab[i] = new Entry(key, value);
            //設(shè)置ThreadLocal數(shù)量
            int sz = ++size;
			//沒有可清理的槽點(diǎn) 并且數(shù)量大于負(fù)載因子 rehash
            if (!cleanSomeSlots(i, sz) && sz >= threshold)
                rehash();
        }

3 儲(chǔ)存位置

儲(chǔ)存在Thread中的兩個(gè)ThreadLocalMap變量

在這里插入圖片描述

4 儲(chǔ)存時(shí)機(jī)

threadLocals 在ThreadLocal對象方法get中去創(chuàng)建 也由ThreadLocal來維護(hù)

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

inheritableThreadLocals 和ThreadLocal類似 InheritableThreadLocal重寫了createMap方法

void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }

inheritableThreadLocals 作用是將ThreadLocalMap傳遞給子線程

在這里插入圖片描述

init方法中 條件滿足后直接為子線程創(chuàng)建ThreadLocalMap

在這里插入圖片描述

重要

a: 僅在初始化子線程的時(shí)候會(huì)傳遞 中途改變副線程的inheritableThreadLocals 變量 不會(huì)將影響結(jié)果傳遞到子線程 。

b:使用線程池要注意 線程不回收 盡量避免使用父線程的inheritableThreadLocals 導(dǎo)致錯(cuò)誤 

到此這篇關(guān)于java中ThreadLocal和ThreadLocalMap淺析的文章就介紹到這了,更多相關(guān)ThreadLocal和ThreadLocalMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解SpringBoot中5種類型參數(shù)傳遞和json數(shù)據(jù)傳參的操作

    詳解SpringBoot中5種類型參數(shù)傳遞和json數(shù)據(jù)傳參的操作

    當(dāng)涉及到參數(shù)傳遞時(shí),Spring?Boot遵循HTTP協(xié)議,并支持多種參數(shù)傳遞方式,這些參數(shù)傳遞方式可以根據(jù)請求的不同部分進(jìn)行分類,
    2023-12-12
  • SpringCloud的全鏈路灰度發(fā)布方案詳解

    SpringCloud的全鏈路灰度發(fā)布方案詳解

    這篇文章主要介紹了SpringCloud的全鏈路灰度發(fā)布方案詳解,灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式,灰度發(fā)布可以保證系統(tǒng)的穩(wěn)定性,?在初始灰度的時(shí)候可以發(fā)現(xiàn),?調(diào)整問題,?保證其影響度,需要的朋友可以參考下
    2023-09-09
  • Java如何實(shí)現(xiàn)簡單后臺(tái)訪問并獲取IP

    Java如何實(shí)現(xiàn)簡單后臺(tái)訪問并獲取IP

    這篇文章主要介紹了Java如何實(shí)現(xiàn)簡單后臺(tái)訪問并獲取IP,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 深入分析Comparable與Comparator及Clonable三個(gè)Java接口

    深入分析Comparable與Comparator及Clonable三個(gè)Java接口

    接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統(tǒng)一格式進(jìn)行定義,這篇文章主要為大家詳細(xì)介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • Java中處理I/O操作的不同方式

    Java中處理I/O操作的不同方式

    BIO、NIO和AIO是Java中處理I/O操作的三種不同方式,它們分別代表阻塞I/O、非阻塞I/O和異步I/O,本文我們結(jié)合代碼進(jìn)行一個(gè)綜合演示,代碼由于是偽代碼,可能存在不足,僅供大家參考
    2024-02-02
  • VSCode搭建Java開發(fā)環(huán)境的超詳細(xì)步驟

    VSCode搭建Java開發(fā)環(huán)境的超詳細(xì)步驟

    VSCode是一款多平臺(tái)的源代碼編輯器,支持多種編程語言,它輕量級、功能強(qiáng)大,通過豐富的插件生態(tài)系統(tǒng)可以支持更多語言和運(yùn)行時(shí),如C++、C#、Java、Python等,這篇文章主要介紹了VSCode搭建Java開發(fā)環(huán)境的超詳細(xì)步驟,需要的朋友可以參考下
    2024-10-10
  • SpringCloud 限流、熔斷、降級的區(qū)別及實(shí)現(xiàn)

    SpringCloud 限流、熔斷、降級的區(qū)別及實(shí)現(xiàn)

    本文主要介紹了SpringCloud 限流、熔斷、降級的區(qū)別及實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Java was started but returned exit code=13問題解決案例詳解

    Java was started but returned exit code=13問題解決案例詳解

    這篇文章主要介紹了Java was started but returned exit code=13問題解決案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java虛擬機(jī)工作原理

    Java虛擬機(jī)工作原理

    本文主要介紹了Java虛擬機(jī)的工作原理。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • 一文詳解Redisson分布式鎖底層實(shí)現(xiàn)原理

    一文詳解Redisson分布式鎖底層實(shí)現(xiàn)原理

    這篇文章主要詳細(xì)介紹了Redisson分布式鎖底層實(shí)現(xiàn)原理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評論

巢湖市| 阜康市| 抚顺市| 名山县| 仲巴县| 海安县| 漯河市| 分宜县| 牙克石市| 卫辉市| 绩溪县| 呼伦贝尔市| 濉溪县| 萝北县| 马边| 临泽县| 京山县| 手游| 桃园县| 乳山市| 读书| 缙云县| 临汾市| 南丹县| 屏东市| 青田县| 明光市| 云梦县| 利辛县| 广饶县| 新营市| 阳原县| 五河县| 虹口区| 嫩江县| 锡林郭勒盟| 青神县| 开远市| 东乡族自治县| 永仁县| 澄城县|