成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ThreadLocal最全詳解(萬字圖文總結)

開發 前端
ThreadLocal提供了線程的本地變量,是 Java 中用于實現線程局部變量的類,它提供了線程內部的獨立變量。即即每個線程都有一個獨立的"變量副本",不會與其他線程的"變量副本"產生沖突。

大家好,我是mikechen。

ThreadLocal是實現Java并發編程非常重要的一個組件,也是大廠喜歡考察的內容,下面我就全面來詳解ThreadLocal@mikechen

ThreadLocal

ThreadLocal提供了線程的本地變量,是 Java 中用于實現線程局部變量的類,它提供了線程內部的獨立變量。

即即每個線程都有一個獨立的"變量副本",不會與其他線程的"變量副本"產生沖突。

如下圖所示:

圖片圖片

每個線程都有自己的獨立資源,可以通過 ThreadLocal 對象訪問它自己的獨立變量。

ThreadLocal中填充的變量屬于當前線程,該變量對其他線程而言是隔離的,也就是說該變量是當前線程獨有的變量。

ThreadLocal主要用于:解決多線程并發時訪問共享變量的問題,主要是做數據隔離。

ThreadLocal原理

ThreadLocal原理:ThreadLocal相當于維護了一個map,key就是當前的線程,value就是需要存儲的對象。

這個 Map 不是直接使用 HashMap ,而是 ThreadLocal 實現的一個叫做 ThreadLocalMap 的靜態內部類,用來存變量。

它的大概結構如下圖所示:

圖片圖片

ThreadLocalMap

ThreadLocalMap 是 ThreadLocal 的核心存儲結構,類似于 HashMap,但設計上有所不同:

ThreadLocalMap 是 ThreadLocal 的內部靜態類,是一個自定義的哈希表,專門用于存儲與 ThreadLocal 關聯的數據。

每個線程都持有一個 ThreadLocalMap 實例,以存儲它的 ThreadLocal 變量和對應的值。

ThreadLocalMap是一個Map,key是ThreadLocal,value是Object。

Entry 類

除此之外,ThreadLocalMap內部持有一個 Entry[] 類型的數組 table,每個數組成員都是一個鍵值對,Entry數組是真正承載數據的地方。

ThreadLocalMap.Entry 繼承自 Java 標準庫中的 WeakReference<ThreadLocal<?>>,它的核心結構如下:

static class Entry extends WeakReference<ThreadLocal<?>> {
    /** The value associated with this ThreadLocal. */
    Object value;
    //key就是一個弱引用
    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

Entry繼承自WeakReference,每個Entry 的 key 都是一個 ThreadLocal 對象的弱引用,Java 中的弱引用允許對一個對象的引用在沒有強引用的情況下,被垃圾回收器回收。

value 是Object 類型,是強引用,ThreadLocalMap 中可以包含多個ThreadLocal對象。

如下圖所示:

圖片圖片

ThreadLocalMap中包含了多個ThreadLocal對象,那么如果一個線程使用多個ThreadLocal對象,ThreadLocalMap如何區分不同的ThreadLocal呢?

實際上,每一個ThreadLocal對象都包含了一個獨一無二的threadLocalHashCode值,使用這個值就可以在KV數組中找到對應的本地變量。

圖片圖片

key是ThreadLocal對象的弱引用,之所以使用 WeakReference 類型作為ThreadLocal對象的引用,是出于垃圾回收考慮。

不過需要注意的是,雖然key值是弱引用,不影響ThreadLocal對象回收,但value值是強引用。

當ThreadLocal被回收,value對象不會被回收,可能會引發內存泄漏。

所以,記得要調用 remove() 方法,避免內存泄露。

ThreadLocal使用

ThreadLocal的用法,這個類提供thread-local變量,這些變量與線程的局部變量不同,每個線程都保存一份改變量的副本,可以通過get、或者set方法訪問。

如下所示:

//創建
private ThreadLocal threadLocal = new ThreadLocal();
//一旦創建了ThreadLocal,就可以使用它的set()方法設置要存儲在其中的值
threadLocal.set("A thread local value");
//獲取值
String threadLocalValue = (String) threadLocal.get();
//移除一個值
threadLocal.remove();

ThreadLocal提供了線程內存儲變量的能力,這些變量不同之處在于每一個線程讀取的變量是對應的互相獨立的,通過get和set方法就可以得到當前線程對應的值。

由于ThreadLocal里設置的值,只有當前線程自己看得見,這意味著你不可能通過其他線程為它初始化值,為了彌補這一點,ThreadLocal提供了一個withInitial()方法統一初始化所有線程的ThreadLocal的值。

如下所示:

private ThreadLocal<Integer> localInt = ThreadLocal.withInitial(() -> 18);

上述代碼將ThreadLocal的初始值設置為18,這對全體線程都是可見的。

ThreadLocal應用

在通常的業務開發中,ThreadLocal 有以下3種典型的使用場景:

圖片圖片

1.解決線程安全問題

ThreadLocal 用作保存每個線程獨享的對象,為每個線程都創建一個副本,這樣每個線程都可以修改自己所擁有的副本, 而不會影響其他線程的副本,確保了線程安全。

2.代替參數的顯式傳遞

當我們在寫API接口的時候,通常Controller層會接受來自前端的入參。

當這個接口功能比較復雜的時候,通常情況下,我們會在每個調用的方法上加上需要傳遞的參數。

但是,如果我們將參數存入ThreadLocal中,那么就不用顯式的傳遞參數了,而是只需要ThreadLocal中獲取即可。

這是因為:使用參數傳遞造成代碼的耦合度高,使用靜態全局變量在多線程環境下不安全,當該對象用ThreadLocal包裝過后,就可以保證在該線程中獨此一份,同時和其他線程隔離。

比如:在Spring的@Transaction事務聲明的注解中,就使用ThreadLocal保存了當前的Connection對象,避免在本次調用的不同方法中使用不同的Connection對象。

3.全局存儲用戶信息

可以嘗試使用ThreadLocal替代Session的使用,每個線程擁有獨立的 Session 對象。

當用戶要訪問需要授權的接口的時候,可以現在攔截器中將用戶的Token存入ThreadLocal中,之后在本次訪問中任何需要用戶用戶信息的都可以直接沖ThreadLocal中拿取數據。

責任編輯:武曉燕 來源: mikechen的互聯網架構
相關推薦

2024-12-31 00:00:01

驅動設計應用場景業務邏輯

2024-09-26 13:33:12

2024-08-30 10:29:21

2024-07-26 10:35:00

2024-09-04 09:43:36

2021-03-16 08:21:29

Spark系統并行

2023-10-31 12:58:00

TypeScriptJavaScript

2024-08-29 10:23:42

2024-05-31 13:34:57

2022-09-06 08:02:40

死鎖順序鎖輪詢鎖

2024-08-08 13:01:53

2020-03-18 12:47:59

設計模式ERP

2024-08-12 16:09:31

2020-01-15 09:53:59

MySQL緩存索引

2024-05-10 12:59:58

PyTorch人工智能

2021-03-18 10:04:46

數據倉庫體系

2023-12-04 08:10:34

Spring循環依賴

2023-02-16 18:22:44

ChatGPTWolfram語言

2020-11-05 08:14:17

鏈表

2023-10-26 00:37:40

滴滴彈性云公有云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区视频在线观看 | 盗摄精品av一区二区三区 | 国产97在线 | 日韩 | 国产一级电影在线观看 | 国产精品日韩欧美一区二区三区 | 激情五月婷婷丁香 | 亚洲综合无码一区二区 | 日韩久久久久 | 精品视频一区二区三区在线观看 | 精品国产乱码久久久久久老虎 | 欧美a区 | 狠狠干狠狠插 | 狠狠艹| 欧美a在线 | 久久狠狠| 一区二区三区日本 | 在线国产一区 | 日韩 国产 在线 | 一级黄色毛片 | 亚洲国产精品一区二区久久 | 中文字幕一区二区三区精彩视频 | 国产精品久久久久久久久久 | 操久久 | 久久精品一二三影院 | 成人免费视频 | 干干天天| 免费视频一区二区三区在线观看 | 日韩a v在线免费观看 | 国产精品永久在线观看 | 欧美性一区二区三区 | 精品少妇一区二区三区日产乱码 | 超碰一区二区 | 99精品视频一区二区三区 | 精品视频在线播放 | 日韩毛片免费视频 | 国产精品久久久久久久久久 | 91色在线| 一区二区三区精品 | 黄色一级毛片免费看 | 精品久久久久久久 | 国产一极毛片 |