秋招Java后端開發沖刺——并發篇2(ThreadLocal、Future接口)

本文對ThreadLocal類和Future接口進行了總結概括,包括ThreadLocal類的原理、內存泄露等問題,和Future接口的使用等問題。

一、ThreadLocal

1. 介紹
ThreadLocal(線程局部變量)是Java中的一個類,線程通過維護一個本地變量副本,從而保證對該變量的訪問不受其他線程的影響。
2. 實現原理

  • 每個線程中都有一個ThreadLocalMap 類型的threadLocals 變量和 一個 inheritableThreadLocals 變量
  • ThreadLocalMap是ThreadLocal的靜態內部類,存儲的是以ThreadLocal實例為 key ,Object 對象為 value 的鍵值對
  • 當調用ThreadLocal類實例的get和set方法修改變量值的時候實際上調用的是ThreadLocalMap類的get和set方法,數據實際存儲在ThreadLocalMap中
    在這里插入圖片描述
  • 源碼

① get方法

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();
}

② set方法

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

3. 內存泄漏問題

(1)虛引用、弱引用、軟引用和強引用

  • 虛引用:主要用于在對象被回收時,進行一些后續處理工作;必須和引用隊列(ReferenceQueue)聯合使用
  • 弱引用:主要用于實現規范化映射;當垃圾收集器運行時,無論內存是否充足都會回收這些對象
  • 軟引用:要用于實現內存敏感的緩存;在垃圾收集器判斷內存不足時,會回收這些對象
  • 強引用:當一個對象被強引用時,垃圾收集器不會回收該對象,即使內存不足也不會回收。通過new對象實例可以創建。

(2)ThreaLocal內存泄露是因為ThreadLocalMap 中的 key 為 ThreadLocal 的弱引用,而 value 是強引用,因此當垃圾回收時會回收ThreadLocal對象實例,而與之對應的value不會被回收,之后該value也不能再使用,由此導致內存泄露。
:使用ThreadLocal時一定要手動調用remove()方法

二、 Future接口

1. 介紹
Future 接口提供了一種處理異步計算結果的機制,通過使用 Future 和 其實現類FutureTask,可以方便地處理并發編程中的異步任務管理。
2. 常用方法

方法描述
boolean cancel(boolean mayInterruptIfRunning)嘗試取消任務的執行。如果任務已完成或已被取消,返回 falsemayInterruptIfRunning 指示是否應該中斷正在執行的任務。
boolean isCancelled()如果任務在完成前被取消,則返回 true
boolean isDone()如果任務已完成(無論是正常完成、異常終止還是取消),返回 true
V get() throws InterruptedException, ExecutionException等待任務完成并獲取結果。如果任務執行過程中拋出異常,則拋出 ExecutionException。若當前線程被中斷,拋出 InterruptedException
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException在指定時間內等待任務完成并獲取結果。如果在指定時間內任務沒有完成,拋出 TimeoutException。若任務執行過程中拋出異常,拋出 ExecutionException。若當前線程被中斷,拋出 InterruptedException

3. CompletableFuture 和Future之間的區別與聯系

特性FutureCompletableFuture
接口/類接口類(實現了 Future 和 CompletionStage 接口)
異步任務不能直接表示異步任務,只能表示異步任務的結果可以直接表示異步任務并提供豐富的異步編程支持
任務完成通知只能通過阻塞的 get 方法或輪詢 isDone 方法檢查任務是否完成提供 thenApply, thenAccept, thenRun 等方法來注冊回調函數,在任務完成時自動執行
手動完成不支持手動完成任務提供 complete, completeExceptionally 等方法手動完成任務
組合多個任務不支持直接組合多個任務提供 allOf, anyOf 等方法來組合多個任務
異常處理只能通過捕獲 ExecutionException 進行異常處理提供 exceptionally, handle, whenComplete 等方法進行異常處理
非阻塞獲取結果不支持非阻塞地獲取結果提供 join, getNow, orTimeout, completeOnTimeout 等方法非阻塞地獲取結果或處理超時
支持流式 API不支持流式 API支持流式 API,允許通過鏈式調用編寫更簡潔和可讀的異步代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43759.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文帶你徹底搞懂什么是責任鏈模式!!

文章目錄 什么是責任鏈模式?詳細示例SpingMVC 中的責任鏈模式使用總結 什么是責任鏈模式? 在我們日常生活中,經常會出現一種場景:一個請求需要經過多個對象的處理才能得到最終的結果。比如,一個請假申請,需…

STM32智能倉庫管理系統教程

目錄 引言環境準備智能倉庫管理系統基礎代碼實現:實現智能倉庫管理系統 4.1 數據采集模塊 4.2 數據處理與控制算法 4.3 通信與網絡系統實現 4.4 用戶界面與數據可視化應用場景:倉庫管理與優化問題解決方案與優化收尾與總結 1. 引言 智能倉庫管理系統通…

藏漢翻譯通作為翻譯軟件的優勢有哪些?

藏漢翻譯通作為一款專業的藏漢雙語翻譯軟件,具有以下優勢: 人工智能技術應用:藏漢翻譯通利用了人工智能翻譯和語音識別合成技術,提供智能藏文翻譯服務。 高準確率:文字識別準確率可達90%,語音識別轉化文字…

蒼穹外賣--導入分類模塊功能代碼

把各層代碼拷貝到所需文件夾下, 進行編譯 在運行 提交和推送倉庫

解鎖AI大模型潛能:預訓練、遷移學習與中間件編程的協同藝術

在人工智能的浩瀚星空中,大型預訓練模型(Large Language Models, LLMs)猶如璀璨的星辰,引領著技術革新的浪潮。這些模型通過海量數據的滋養,學會了理解語言、生成文本乃至執行復雜任務的能力。然而,要讓這些…

【正點原子i.MX93開發板試用連載體驗】項目計劃和開箱體驗

本文最早發表于電子發燒友:【   】【正點原子i.MX93開發板試用連載體驗】基于深度學習的語音本地控制 - 正點原子學習小組 - 電子技術論壇 - 廣受歡迎的專業電子論壇! (elecfans.com)https://bbs.elecfans.com/jishu_2438354_1_1.html 有一段時間沒有參加電子發…

Pyspider WebUI 未授權訪問致遠程代碼執行漏洞復現

0x01 產品簡介 Pyspider是由國人binux編寫的強大的網絡爬蟲系統,它帶有強大的WebUI(Web用戶界面),為用戶提供了可視化的編寫、調試和管理爬蟲的能力。這一特點使得Pyspider在爬蟲框架中脫穎而出,尤其適合那些希望快速上手并高效開發爬蟲的用戶。允許用戶直接在網頁上編寫…

for in和for of對比

不同點: 時間點不同:for in 在js出現之初就有,for of出現在ES6之后 遍歷的內容不同:for in用于遍歷對象的可枚舉屬性(包括原型鏈上的可枚舉屬性),for of用于遍歷可迭代對象的值 看個例子 // for in const arr [a,b,…

Linux--線程的控制

目錄 0.前言 1.pthread庫 2.關于控制線程的接口 2.1.創建線程(pthread_create) 2.2.線程等待(pthread_join) 代碼示例1: ?編輯 ***一些問題*** 2. 3.創建多線程 3.線程的終止 (pthread_exit /…

給數組/對象添加一個(key-value)對象

需要將一個value值前面加上key值,放進數組/對象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target:要更改的數據源(可以是對象或者數組) key:要更改的具體數據 value :重新賦的值。 結果:…

文華財經盤立方多空變色波段趨勢線指標公式源碼

文華財經盤立方多空變色波段趨勢線指標公式源碼&#xff1a; N1:20; N2:ROUND(N1/2,1); N3:ROUND(SQRT(N1),1); N4:2*EMA2(C,N2)-EMA2(C,N1); 尊重市場:EMA2(N4,N3),COLORRED,LINETHICK2; 尊重市場1:IF(尊重市場<REF(尊重市場,1), 尊重市場,NULL),COLORGREEN,LINETHIC…

C++之List模擬實現

目錄 list的邏輯結構 構造函數 拷貝構造函數 賦值運算符重載 返回迭代器的初始位置 返回迭代器的最終位置 元素的插入 頭插 尾插 刪除元素 頭刪 尾刪 清空整個鏈表 析構函數 正向迭代器 反向迭代器 整體代碼 上期我們學寫了list的基本操作&#xff0c;本期我…

蘇東坡傳-讀書筆記十一

蘇東坡對寫作與風格所表示的意見最為清楚。他說做文章“大略如行云流水&#xff0c;初無定質&#xff0c;但常行于所當行&#xff0c;常止于所不可不止。文理自然&#xff0c;姿態橫生。孔子曰&#xff1a;‘言之不文&#xff0c;行而不遠。’又曰&#xff1a;‘辭達而已矣。’…

【cocos creator】2.4.x實現簡單3d功能,點擊選中,旋轉,材質修改,透明材質

demo下載:(待審核) https://download.csdn.net/download/K86338236/89527924 const {ccclass, property } = cc._decorator;const enum box_color {NORMAL = 0,DASHED_LINE = 1,//虛線TRANSLUCENT = 2,//半透明 }@ccclass export default class main extends cc.Component {…

STC32G/F/8H通用無刷電機驅動板

STC32G/F/8H通用無刷電機驅動板 &#x1f4cc;相關篇《低成本STC32G8K64驅動控制BLDC開源入門學習方案》 ?該驅動板是在上一版的基礎上改版而來。這里的STC32G/F/8H所指的是封裝型號為-LQFP48的STC32G8K64、STC32G12K128、STC32F12K54、STC8H8K64U。是一款兼容有感和無感設計的…

數據結構--樹和二叉樹的一些知識點總結

樹是n個結點的有限集&#xff0c;當n0時&#xff0c;稱為空樹。樹是一種遞歸的數據結構&#xff0c;樹作為一種邏輯結構同時也是一種分層的結構結點的深度是從根開始自頂向下累加&#xff1b;結點的高度是從葉結點自底向上累加由于樹中的分支是有向的&#xff0c;即從雙親指向孩…

【Java算法】二分查找 下

&#x1f525;個人主頁&#xff1a; 中草藥 &#x1f525;專欄&#xff1a;【算法工作坊】算法實戰揭秘 一.山脈數組的峰頂索引 題目鏈接&#xff1a;852.山脈數組的峰頂 ? 算法原理 這段代碼實現了一個查找山峰數組中峰值索引的算法。山峰數組是一個先遞增后遞減的數組&…

玩具營銷是如何拿捏成年人錢包?

好像現在的成年人逐漸熱衷于偏向年輕化&#xff0c;問問題會好奇“尊嘟假嘟”&#xff0c;飯量上的“兒童套餐”&#xff0c;娃娃機前排長隊......而最突出的莫過于各類各式的玩具不斷收割當代年輕人&#xff0c;除去常給大朋友們小朋友們送去玩具福利的“麥、肯”雙門&#xf…

激光干涉儀可以完成哪些測量:全面應用解析

在高端制造領域&#xff0c;精度是衡量產品質量的關鍵指標之一。激光干涉儀作為一項高精度測量技術&#xff0c;其應用廣泛&#xff0c;對于提升產品制造精度具有重要意義。 線性測量&#xff1a;精確定位的基礎 激光干涉儀采用邁克爾遜干涉原理&#xff0c;實現線性測量。該…

AlphaGo 的傳奇故事

文章目錄 一、說明二、AlphaGo 傳奇&#xff08;一&#xff09;&#xff1a;游戲規則三、AlphaGo 傳奇(二)&#xff1a;它是如何運作的&#xff1f;四、AlphaGo 傳奇&#xff08;三&#xff09;&#xff1a;史詩般的戰斗和人工智能的未來 一、說明 1997 年&#xff0c;IBM 的“…