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

ThreadLocal的set方法原理示例解析

 更新時間:2023年02月20日 08:30:58   作者:yunmengmeng  
這篇文章主要為大家介紹了ThreadLocal的set方法原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前沿知識

  • ThreadLocal存儲線程變量,使用set方法設(shè)置變量,使用get方法獲取變量
  • 線程隔離的實現(xiàn)是每個Thread類有一個類型為ThreadLocal.ThreadLocalMap的實例變量threadLocals。如下圖所示,ThreadLocalMap內(nèi)部有一個Entry數(shù)組,每個Entry的key是ThreadLocal,也就是referent對象,value是設(shè)置的值;該類的size變量記錄當(dāng)前數(shù)組使用容量;threshold變量記錄閾值,默認(rèn)總?cè)萘康娜种?,初始?0

  • threadLocal通過哈希算法決定落于哪一個Entry,GC時,如果threadLocal沒有引用,會被回收,即referent值為null,否則不回收,value不會回收,因此要使用remove方法刪除對應(yīng)Entry,否則可能會出現(xiàn)內(nèi)存泄漏

set方法

ThreadLocal->set()

第一種:如果線程第一次執(zhí)行set方法,此時map為空,會創(chuàng)建。在此過程中初始化entry的個數(shù)為16,threshold為10,同時根據(jù)哈希值定位對應(yīng)下標(biāo)的entry并賦值

如果map不為空,走ThreadLocalMapset方法,根據(jù)哈希值找到對應(yīng)的下標(biāo)。從源代碼中可知:

第二種:如果該下標(biāo)為空,那么直接賦值

如果該下標(biāo)不為空,那么從當(dāng)前下標(biāo)開始遍歷,直到下一個entry為null時停止

第三種:如果entry的key是當(dāng)前thread,直接替換值

第四種:如果循環(huán)結(jié)束,說明遇到了空entry,那么直接賦值到該下標(biāo)

如果之前發(fā)生了GC,那么entry不為空,但是key為空,此時調(diào)用replaceStaleEntry方法

記錄此下標(biāo)為staleSlot、slotToExpunge變量,從當(dāng)前下標(biāo)的前一個entry開始遍歷,直到entry為null時停止,如果有回收的entry,那么記錄它的下標(biāo),賦值到slotToExpunge變量

從當(dāng)前下標(biāo)的后一個entry開始遍歷,直到entry為null時停止

第五種:如果遇到了key相等的情況,那么替換值,該entry與staleSlot下標(biāo)的entry交換。如果向前遍歷沒有找到回收的entry,那么記錄并賦值到slotToExpunge變量。清理過期entry,最后返回

第六種:如果循環(huán)結(jié)束,說明遇到了空entry,也沒有找到key相等的entry。那么清除staleSlot下標(biāo)的value,然后新建entry。如果有記錄過期entry,那么會清理,最后返回

賦值結(jié)束后,還會進行一次嘗試清理,如果沒有過期entry,并且當(dāng)前容量大于等于閾值,走擴容rehash方法

清理與擴容

expungeStaleEntry(staleSlot):由于傳入的下標(biāo)staleSlot所在entry一定是GC之后的,因此會將entry的值設(shè)為null,隨后刪除entry。從下一個entry開始遍歷,直到entry為null時停止,如果entry是GC過的,將value置為null,否則將key重新哈希和分配,這樣的目的是使得entry離正確的下標(biāo)位置更接近一些。最后返回entry為null的坐標(biāo)

cleanSomeSlots(i,n):參數(shù)n一般是當(dāng)前的size值。從i的下一個entry開始遍歷,每遍歷一次,n的值就減少一半,直到為0時停止。如果所在下標(biāo)的entry是GC過的,那么會調(diào)用一次expungeStaleEntry(staleSlot)方法

rehash():首先調(diào)用一次清理方法,然后判斷當(dāng)前容量是否超過閾值的四分之三(約總?cè)萘康亩种唬?/strong>,然后才真正擴容,每次擴容一倍。循環(huán)遍歷entry數(shù)組,如果entry發(fā)生GC,那么將值設(shè)置為null,否則將key重新哈希和分配,最后重新計算閾值和當(dāng)前使用容量

總結(jié)

總的來說,執(zhí)行set方法時,一共有六種不同的情況。ThreadLocalMapHashMap相比,它們的實現(xiàn)都是數(shù)組+hash定位,但是它們的沖突、擴容實現(xiàn)卻大不相同,ThreadLocalMap還會清理過期entry,這種獨特的實現(xiàn)方式值得探究

以上就是ThreadLocal的set方法原理示例解析的詳細內(nèi)容,更多關(guān)于ThreadLocal set方法原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Swagger實現(xiàn)接口版本號管理方式

    使用Swagger實現(xiàn)接口版本號管理方式

    這篇文章主要介紹了使用Swagger實現(xiàn)接口版本號管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JAVA 并發(fā)容器的一些易出錯點你知道嗎

    JAVA 并發(fā)容器的一些易出錯點你知道嗎

    今天給大家?guī)淼奈恼率荍ava并發(fā)編程的相關(guān)知識,文中對java同步容器與并發(fā)容器做了非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-09-09
  • Spring MVC   文件、cookies的接收 與REST響應(yīng)詳解

    Spring MVC   文件、cookies的接收 與REST響應(yīng)詳

    在SpringMVC中,使用@RequestPart注解可接收文件并處理多部分請求,同時可以通過@CookieValue和HttpServletResponse來獲取和設(shè)置Cookies,本文介紹Spring MVC   文件、cookies的接收 與REST響應(yīng),感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Spring Boot攔截器Interceptor與過濾器Filter詳細教程(示例詳解)

    Spring Boot攔截器Interceptor與過濾器Filter詳細教程(示例詳解)

    本文詳細介紹了SpringBoot中的攔截器(Interceptor)和過濾器(Filter),包括它們的定義、作用范圍、使用場景、實現(xiàn)步驟、執(zhí)行順序、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • spring boot整合redis實現(xiàn)shiro的分布式session共享的方法

    spring boot整合redis實現(xiàn)shiro的分布式session共享的方法

    本篇文章主要介紹了spring boot整合redis實現(xiàn)shiro的分布式session共享的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Spring Cloud Gateway 使用JWT工具類做用戶登錄校驗功能

    Spring Cloud Gateway 使用JWT工具類做用戶登錄校驗功能

    這篇文章主要介紹了Spring Cloud Gateway 使用JWT工具類做用戶登錄校驗的示例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java面試題沖刺第十三天--數(shù)據(jù)庫(3)

    Java面試題沖刺第十三天--數(shù)據(jù)庫(3)

    這篇文章主要為大家分享了最有價值的三道數(shù)據(jù)庫面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java實現(xiàn)按鍵精靈的示例代碼

    Java實現(xiàn)按鍵精靈的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)按鍵精靈,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定的參考價值,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Monaco?Editor實現(xiàn)sql和java代碼提示實現(xiàn)示例

    Monaco?Editor實現(xiàn)sql和java代碼提示實現(xiàn)示例

    這篇文章主要為大家介紹了Monaco?Editor代碼提示sql和java實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 詳解Maven Docker鏡像使用技巧

    詳解Maven Docker鏡像使用技巧

    這篇文章主要介紹了詳解Maven Docker鏡像使用技巧,Maven是目前最流行的Java項目管理工具之一,提供了強大的包依賴管理和應(yīng)用構(gòu)建功能。本文以Maven為例介紹了Docker在應(yīng)用構(gòu)建中的一些常見技巧。
    2018-06-06

最新評論

和平县| 鄂尔多斯市| 南靖县| 内丘县| 巴中市| 巢湖市| 高陵县| 永靖县| 乌恰县| 二连浩特市| 闽侯县| 封丘县| 从江县| 九寨沟县| 积石山| 平遥县| 禄丰县| 赤壁市| 和静县| 阿鲁科尔沁旗| 临汾市| 桂阳县| 宜黄县| 丹寨县| 本溪市| 霍州市| 右玉县| 章丘市| 长岭县| 金寨县| 宣武区| 类乌齐县| 邯郸县| 兴业县| 兴仁县| 育儿| 元谋县| 清原| 上思县| 榆社县| 临清市|