日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

談談你對ThreadLocal的理解

來源: 責編: 時間:2023-11-28 17:11:50 222觀看
導讀思考:對ThreadLocal的理解多少?springboot葵花寶典主要分享JAVA技術,主要包含SpringBoot、SpingCloud、Docker、中間件等技術,以及Github開源項目1.ThreadLocal概述ThreadLocal是多線程中對于解決線程安全的一個操作類


7Xv28資訊網——每日最新資訊28at.com

圖片7Xv28資訊網——每日最新資訊28at.com

思考:對ThreadLocal的理解多少?7Xv28資訊網——每日最新資訊28at.com

springboot葵花寶典7Xv28資訊網——每日最新資訊28at.com

主要分享JAVA技術,主要包含SpringBoot、SpingCloud、Docker、中間件等技術,以及Github開源項目7Xv28資訊網——每日最新資訊28at.com

1.ThreadLocal概述

ThreadLocal是多線程中對于解決線程安全的一個操作類,它會為每個線程都分配一個獨立的線程副本從而解決了變量并發訪問沖突的問題。ThreadLocal 同時實現了線程內的資源共享7Xv28資訊網——每日最新資訊28at.com

案例:使用JDBC操作數據庫時,會將每一個線程的Connection放入各自的ThreadLocal中,從而保證每個線程都在各自的 Connection 上進行數據庫的操作,避免A線程關閉了B線程的連接。7Xv28資訊網——每日最新資訊28at.com

圖片圖片7Xv28資訊網——每日最新資訊28at.com

2. ThreadLocal的實現原理&源碼解析

ThreadLocal本質來說就是一個線程內部存儲類,從而讓多個線程只操作自己內部的值,從而實現線程數據隔離7Xv28資訊網——每日最新資訊28at.com

每個線程內有一個 ThreadLocalMap 類型的成員變量,用來存儲資源對象7Xv28資訊網——每日最新資訊28at.com

圖片圖片7Xv28資訊網——每日最新資訊28at.com

ThreadLocalMap 的一些特點7Xv28資訊網——每日最新資訊28at.com

key 的 hash 值統一分配7Xv28資訊網——每日最新資訊28at.com

初始容量 16,擴容因子 2/3,擴容容量翻倍7Xv28資訊網——每日最新資訊28at.com

key 索引沖突后用開放尋址法解決沖突7Xv28資訊網——每日最新資訊28at.com

2.1. ThreadLocal基本使用

set(value) 設置值:  以 ThreadLocal 自己作為 key,資源對象作為 value,放入當前線程的 ThreadLocalMap 集合中7Xv28資訊網——每日最新資訊28at.com

get() 獲取值: 以 ThreadLocal 自己作為 key,到當前線程中查找關聯的資源值7Xv28資訊網——每日最新資訊28at.com

remove() 清除值: 以 ThreadLocal 自己作為 key,移除當前線程關聯的資源值7Xv28資訊網——每日最新資訊28at.com

代碼案例7Xv28資訊網——每日最新資訊28at.com

public class ThreadLocalTest {    static ThreadLocal<String> threadLocal = new ThreadLocal<>();    public static void main(String[] args) {        new Thread(() -> {            String name = Thread.currentThread().getName();            threadLocal.set("zbbmeta");            print(name);            System.out.println(name + "-after remove : " + threadLocal.get());        }, "t1").start();        new Thread(() -> {            String name = Thread.currentThread().getName();            threadLocal.set("zbbmeta");            print(name);            System.out.println(name + "-after remove : " + threadLocal.get());        }, "t2").start();    }    static void print(String str) {        //打印當前線程中本地內存中本地變量的值        System.out.println(str + " :" + threadLocal.get());        //清除本地內存中的本地變量        threadLocal.remove();    }}

3. ThreadLocal-內存泄露問題

在介紹內存泄露問題問題之前先介紹一下Java對象中的四種引用類型:Java對象中的四種引用類型:7Xv28資訊網——每日最新資訊28at.com

  • 強引用: 最為普通的引用方式,表示一個對象處于有用且必須的狀態,如果一個對象具有強引用,則GC并不會回收它。即便堆中內存不足了,寧可出現OOM,也不會對其進行回收
Object obj = new Object();
  • 軟引用:軟引用用于描述一些還有用但并非必須保持的對象。在系統即將發生內存溢出之前,垃圾收集器會清理這些軟引用指向的對象
Object obj = new Object();SoftReference<Object> softRef = new SoftReference<>(obj);
  • 弱引用:表示一個對象處于可能有用且非必須的狀態。在GC線程掃描內存區域時,一旦發現弱引用,就會回收到弱引用相關聯的對象。對于弱引用的回收,無關內存區域是否足夠,一旦發現則會被回收
Object obj = new Object();WeakReference<Object> weakRef = new WeakReference<>(obj);
  • 虛引用:虛引用也稱為幽靈引用,它幾乎沒有實際意義,主要用于跟蹤對象被垃圾收集的活動;虛引用不能單獨使用,必須與引用隊列(ReferenceQueue)一起使用。當垃圾收集器準備回收一個對象時,如果發現它有虛引用,會把這個虛引用加入到與之關聯的引用隊列中
Object obj = new Object();PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue);

3.1. ThreadLocal-內存泄露問題

每一個Thread維護一個ThreadLocalMap,在ThreadLocalMap中的Entry對象繼承了WeakReference,其中key為使用弱引用的ThreadLocal實例,value為線程變量的副本7Xv28資訊網——每日最新資訊28at.com

圖片圖片7Xv28資訊網——每日最新資訊28at.com

ThreadLocalMap 中的 key 被設計為弱引用,原因如下7Xv28資訊網——每日最新資訊28at.com

Thread 可能需要長時間運行(如線程池中的線程),如果 key 不再使用,需要在內存不足(GC)時釋放其占用的內存7Xv28資訊網——每日最新資訊28at.com

內存釋放時機7Xv28資訊網——每日最新資訊28at.com

  • 被動 GC 釋放 key

僅是讓 key 的內存釋放,關聯 value 的內存并不會釋放7Xv28資訊網——每日最新資訊28at.com

  • 懶惰被動釋放 value
  • get key 時,發現是 null key,則釋放其 value 內存
  • set key 時,會使用啟發式掃描,清除臨近的 null key 的 value 內存,啟發次數與元素個數,是否發現 null key 有關
  • 主動 remove 釋放 key,value
  • 會同時釋放 key,value 的內存,也會清除臨近的 null key 的 value 內存
  • 推薦使用它,因為一般使用 ThreadLocal 時都把它作為靜態變量(即強引用),因此無法被動依靠 GC 回收

4. ThreadLocal面試題

面試官:談談你對ThreadLocal的理解7Xv28資訊網——每日最新資訊28at.com

候選人:7Xv28資訊網——每日最新資訊28at.com

ThreadLocal 主要功能有兩個:7Xv28資訊網——每日最新資訊28at.com

  • 第一個是可以實現資源對象的線程隔離,讓每個線程各用各的資源對象,避免爭用引發的線程安全問題
  • 第二個是實現了線程內的資源共享

面試官:好的,那你知道ThreadLocal的底層原理實現嗎?7Xv28資訊網——每日最新資訊28at.com

候選人:7Xv28資訊網——每日最新資訊28at.com

在ThreadLocal內部維護了一個一個 ThreadLocalMap 類型的成員變量,用來存儲資源對象7Xv28資訊網——每日最新資訊28at.com

當我們調用 set 方法,就是以 ThreadLocal 自己作為 key,資源對象作為 value,放入當前線程的 ThreadLocalMap 集合中7Xv28資訊網——每日最新資訊28at.com

當調用 get 方法,就是以 ThreadLocal 自己作為 key,到當前線程中查找關聯的資源值7Xv28資訊網——每日最新資訊28at.com

當調用 remove 方法,就是以 ThreadLocal 自己作為 key,移除當前線程關聯的資源值7Xv28資訊網——每日最新資訊28at.com

面試官:好的,那關于ThreadLocal會導致內存溢出這個事情,了解嗎?7Xv28資訊網——每日最新資訊28at.com

候選人:7Xv28資訊網——每日最新資訊28at.com

是應為ThreadLocalMap 中的 key 被設計為弱引用,它是被動的被GC調用釋放key,不過關鍵的是只有key可以得到內存釋放,而value不會,因為value是一個強引用。7Xv28資訊網——每日最新資訊28at.com

在使用ThreadLocal 時都把它作為靜態變量(即強引用),因此無法被動依靠 GC 回收,建議主動的remove 釋放 key,這樣就能避免內存溢出。7Xv28資訊網——每日最新資訊28at.com


7Xv28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34920-0.html談談你對ThreadLocal的理解

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: StarRocks在支付對賬領域的應用

下一篇: 大型直播活動保障S13的實踐和思考

標簽:
  • 熱門焦點
  • 消息稱迪士尼要拍真人版《魔發奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實有點忙,忙著將不少動畫改成真人版,繼《美人魚》后,真人版《白雪公主》、《魔發奇緣》也在路上了。據外媒消息稱,迪士尼將打造真人版
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • OPPO、vivo、小米等國內廠商Q2在印度智能手機市場份額依舊高達55%

    7月20日消息,據外媒報道,研究機構的報告顯示,在全球智能手機出貨量同比仍在下滑的大背景下,印度這一有潛力的市場也未能幸免,出貨量同比也有下滑,多家廠
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
Top 主站蜘蛛池模板: 潢川县| 平邑县| 白朗县| 恭城| 泗水县| 北宁市| 库尔勒市| 田东县| 长岛县| 晋城| 紫金县| 图们市| 乌鲁木齐市| 耒阳市| 从江县| 嘉禾县| 隆回县| 彰化市| 定陶县| 谢通门县| 盐津县| 龙岩市| 三穗县| 肃南| 三台县| 沁阳市| 安仁县| 南投市| 瑞金市| 黄骅市| 伊宁市| 清远市| 赤水市| 铜梁县| 布拖县| 东乌珠穆沁旗| 双辽市| 金寨县| 邢台市| 芜湖市| 赞皇县|