中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ThreadLocal的set方法原理是什么

發布時間:2023-02-25 14:27:45 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

這篇文章主要介紹了ThreadLocal的set方法原理是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇ThreadLocal的set方法原理是什么文章都會有所收獲,下面我們一起來看看吧。

前沿知識

  • ThreadLocal存儲線程變量,使用set方法設置變量,使用get方法獲取變量

  • 線程隔離的實現是每個Thread類有一個類型為ThreadLocal.ThreadLocalMap的實例變量threadLocals。如下圖所示,ThreadLocalMap內部有一個Entry數組,每個Entry的key是ThreadLocal,也就是referent對象,value是設置的值;該類的size變量記錄當前數組使用容量;threshold變量記錄閾值,默認總容量的三分之二,初始是10

ThreadLocal的set方法原理是什么

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

set方法

ThreadLocal->set()

ThreadLocal的set方法原理是什么

第一種:如果線程第一次執行set方法,此時map為空,會創建。在此過程中初始化entry的個數為16,threshold為10,同時根據哈希值定位對應下標的entry并賦值

如果map不為空,走ThreadLocalMapset方法,根據哈希值找到對應的下標。從源代碼中可知:

第二種:如果該下標為空,那么直接賦值

如果該下標不為空,那么從當前下標開始遍歷,直到下一個entry為null時停止

第三種:如果entry的key是當前thread,直接替換值

第四種:如果循環結束,說明遇到了空entry,那么直接賦值到該下標

如果之前發生了GC,那么entry不為空,但是key為空,此時調用replaceStaleEntry方法

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

從當前下標的后一個entry開始遍歷,直到entry為null時停止

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

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

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

清理與擴容

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

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

rehash():首先調用一次清理方法,然后判斷當前容量是否超過閾值的四分之三(約總容量的二分之一),然后才真正擴容,每次擴容一倍。循環遍歷entry數組,如果entry發生GC,那么將值設置為null,否則將key重新哈希和分配,最后重新計算閾值和當前使用容量

關于“ThreadLocal的set方法原理是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“ThreadLocal的set方法原理是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陵川县| 孝义市| 安陆市| 电白县| 鄱阳县| 宁明县| 会同县| 巫溪县| 秦安县| 怀仁县| 海淀区| 闵行区| 扎鲁特旗| 罗江县| 吉林省| 乌什县| 电白县| 西贡区| 泰兴市| 湛江市| 阿瓦提县| 曲麻莱县| 五大连池市| 昭通市| 辽宁省| 聂荣县| 北川| 浦江县| 元朗区| 高密市| 平远县| 蒙阴县| 阿城市| 玉田县| 阿拉善右旗| 富平县| 浦北县| 依兰县| 阆中市| 连城县| 宽城|