精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

了解ThreadLocal,這一篇文章就夠了

原創 精選
開發 前端
很多 Java 開發一般都是做中臺較多,并發編程使用的不多。因此,對 ThreadLocal 不太熟悉,所以筆者這里想讓大家了解它,知道它是用來干什么的。

作者 | 蔡柱梁

審校 | 重樓

一、前言

很多 Java 開發一般都是做中臺較多,并發編程使用的不多。因此,對 ThreadLocal 不太熟悉,所以筆者這里想讓大家了解它,知道它是用來干什么的。

二、ThreadLocal 是用來干什么的

ThreadLocal 是 Java 中一種線程封閉技術,它提供了一種線程本地變量的機制,使得每個線程都擁有一個獨立的變量副本,這樣可以避免多個線程訪問同一個變量時產生的并發問題。

ThreadLocal 在工作中還是蠻常用的,筆者使用到的一些場景如下:

  1. 使用 zk 實現選舉,采用單例 zkClient,但是對于里面一些全局變量就會存在線程安全問題,這時會希望這些特定的全局變量可以跟線程綁定。
  2. 項目UUC(統一認證中心),不同的用戶登錄,系統是如何確保當前用戶的信息不會被張冠李戴的呢?其實都是通過 ThreadLocal 實現的(不過在 UUC 中,筆者使用的是 InheritableThreadLocal,這個會有點區別)。
  3. 參數傳遞,比如流水生成的方法里面的重試機制,假設限制重試 5 次,生成流水號的方法內部很多地方都可能失敗需要重試(并發沖突或者 db 異常),最傳統的方式就是將重試的次數傳遞。這種方式不夠優雅,我們可以使用 ThreadLocal 來實現傳遞。

總的來說,當你需要和線程綁定的變量時,就可以考慮使用 ThreadLocal 啦!

至于線程安全問題,大家不妨想想我們平常說線程安全問題都是出現在什么場景?同一時間有兩個或兩個以上的線程對同一個變量進行修改,才有可能出現線程安全問題。但是使用 ThreadLocal,每個線程是獨享自己的變量副本的,哪里還有線程安全問題呢?

三、ThreadLocal 如何使用

這個上網一搜一大堆,筆者就說下注意事項好了,用完后一定要釋放,避免內存泄漏,提供幾個點給大家參考:

  1. 及時清理
  1. 確保在線程結束時,及時清理 ThreadLocal 中存儲的數據。可以通過在使用完 ThreadLocal 后調用 remove() 方法來清理對應的數據。例如,可以使用 ThreadLocal.remove() 或在 finally 塊中進行清理操作。
  1. 使用弱引用(WeakReference)
  1. 可以使用 ThreadLocal 的變體,如 InheritableThreadLocal 或 WeakThreadLocal,它們使用了弱引用來存儲數據。這樣,在沒有其他強引用指向被存儲的對象時,垃圾回收器可以自動清理該對象,避免內存泄漏。
  1. 避免長時間存儲大量數據
  1. 盡量避免在 ThreadLocal 中存儲大量數據,特別是對于長時間運行的線程。因為 ThreadLocal 的值在線程的整個生命周期中都存在,如果存儲大量數據,可能會導致內存占用過高。
  1. 及時釋放資源
  1. 如果你在 ThreadLocal 中存儲了需要手動釋放的資源,確保在不再需要時及時釋放資源。可以通過在使用完資源后顯式地調用資源的釋放方法或使用 try-with-resources 語句來實現。
  1. 防止線程池中的內存泄漏
  2. 當使用線程池時,要特別小心使用 ThreadLocal。確保在任務完成后清理 ThreadLocal 中的數據,以避免線程重用時的數據干擾和潛在的內存泄漏問題。可以在任務的開始和結束處使用 ThreadLocal 進行數據綁定和解綁。

總之,要正確使用 ThreadLocal 并避免內存泄漏問題,需要注意適時清理、使用弱引用、避免存儲過多數據、及時釋放資源,并在使用線程池時特別小心。

四、ThreadLocal 的實現原理

下面是一個簡單的示例代碼

public class ThreadLocalExample {
 private static final ThreadLocal<Object> threadLocal = new ThreadLocal<>();

 public static void main(String[] args) {
 Thread workerThread = new Thread(() -> {
 try {
 // 在線程中設置ThreadLocal值
 threadLocal.set(new Object());

 // 執行業務邏輯
 // ... 

 } finally {
 // 在線程結束時清理ThreadLocal值
 threadLocal.remove();
 }
 });

 workerThread.start();
 // 等待線程結束
 try {
 workerThread.join();
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
}

在示例代碼中,線程 workerThread 和 ThreadLocal 實例是一個怎樣的關系呢?set 方法和 remove 方法都做了什么呢?為什么會有內存泄漏的情況呢?我們帶著疑問一起往下看。

4.1 java.lang.ThreadLocal#set

我們直接從源碼開始分析 ThreadLocal


public void set(T value) {
 // 獲取當前線程
 Thread t = Thread.currentThread();
 // 通過當前線程獲取ThreadLocalMap 
 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);
 }

 ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
 table = new Entry[INITIAL_CAPACITY];
 int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
 table[i] = new Entry(firstKey, firstValue);
 size = 1;
 setThreshold(INITIAL_CAPACITY);
 }

 static class Entry extends WeakReference<ThreadLocal<?>> {
 /** The value associated with this ThreadLocal. */
 Object value;

 Entry(ThreadLocal<?> k, Object v) {
 super(k);
 value = v;
 }
 }

結合示例代碼來看,這里是當前線程A在 main 方法中通過 threadLocal 實例調用 threadLocal.set 方法,而 set 方法會給當前線程創建一個 ThreadLocalMap(如果沒有的話),并使用 threadLocal 實例作為 key。

它們的關系如下圖

4.2 內存泄漏問題

這里應該分兩種情況看:無線程復用和有線程復用。

  1. 無線程復用
    當 workerThread 結束后,沒有強引用的 ThreadLocalMap 自然而然也會被垃圾回收器回收,不會出現內存泄漏
  2. 有線程復用
    這里也要分開看,有釋放和無釋放的情況。如果發生內存泄漏,當然就是我們沒有釋放導致的(釋放可以通過調用 set、get、remove方法釋放)。當我們使用線程池,線程會被復用時,ThreadLocalMap 的生命周期與它綁定的線程是一樣的,所以不會被回收。如果這時發生了 gc,那么 Entry 的 key 是弱引用,key 會變成 null,而 value 將繼續存活。如果該線程一直不調用 set/get/remove 方法,那么 value 一直得不到釋放,就會發生內存泄漏的現象。

那為什么使用 set/get/remove 可以避免內存泄漏呢?因為 set/get 在根據當前線程找到對應 Entry 元素后(這里是剛好是碰到了 key==null 的 entry[i],碰不到是不會順手釋放舊 value 的。因此,最好還是使用完后調用 remove 釋放),發現 key == null,就會調用java.lang.ThreadLocal.ThreadLocalMap#expungeStaleEntry 釋放引用,所以就不會發生內存泄漏了。這里就不再展示源碼了,有興趣的可以自己去看下。

五、哈希沖突問題

上面看到 ThreadLocalMap 使用了 Hash,是不是馬上就想到了哈希沖突呢?HashMap 遇到哈希沖突,在 key 不相同的情況下,會使用鏈表解決。但是 ThreadLocalMap 的 Entry 沒有 next 指針,因此它明顯不會采用鏈表,那么它是如何解決哈希沖突的呢?

請看 java.lang.ThreadLocal.ThreadLocalMap#set 源碼,筆者添加了注釋,可以看到是怎么解決哈希沖突的

private void set(ThreadLocal<?> key, Object value) {

 // We don't use a fast path as with get() because it is at 
 // least as common to use set() to create new entries as 
 // it is to replace existing ones, in which case, a fast 
 // path would fail more often than not. 

 Entry[] tab = table;
 int len = tab.length;
 int i = key.threadLocalHashCode & (len-1);

 for (Entry e = tab[i];
 e != null;
 // 存在哈希沖突的話,會往下走,如果超過數組長度,就會回到0 
 e = tab[i = nextIndex(i, len)]) {
 ThreadLocal<?> k = e.get();

 if (k == key) {
 // 找到存儲自己的entry,更新value 
 e.value = value;
 return;
 }

 if (k == null) {
 // 因為 gc 導致 key 被回收了,這個 Entry 會被新的 Entry 取代(新的Entry的key和value就是這里的傳參),舊的會被釋放
 replaceStaleEntry(key, value, i);
 return;
 }
 }

 tab[i] = new Entry(key, value);
 int sz = ++size;
 if (!cleanSomeSlots(i, sz) && sz >= threshold)
 rehash();
 }

總結

到這里相信大家對 ThreadLocal 都有一定的了解。有什么想交流可以留言或私信筆者。

作者介紹

蔡柱梁,51CTO社區編輯,從事Java后端開發8年,做過傳統項目廣電BOSS系統,后投身互聯網電商,負責過訂單,TMS,中間件等。

責任編輯:華軒 來源: 51CTO
相關推薦

2018-08-23 16:22:40

2020-08-05 16:09:52

javascript壓縮圖片前端

2020-08-03 10:00:11

前端登錄服務器

2023-04-24 08:00:00

ES集群容器

2018-04-27 15:33:59

Python裝飾器

2023-09-05 07:55:56

Python網絡爬蟲

2020-10-09 08:15:11

JsBridge

2020-08-17 09:25:51

Docker容器技術

2022-05-26 06:05:16

MySQL數據庫

2021-09-27 14:50:11

Python代碼

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項目

2020-05-14 16:35:21

Kubernetes網絡策略DNS

2020-02-18 16:20:03

Redis ANSI C語言日志型

2023-09-11 08:13:03

分布式跟蹤工具

2022-08-01 11:33:09

用戶分析標簽策略

2021-04-08 07:37:39

隊列數據結構算法

2019-08-13 15:36:57

限流算法令牌桶

2021-06-30 00:20:12

Hangfire.NET平臺

2023-05-12 08:19:12

Netty程序框架
點贊
收藏

51CTO技術棧公眾號

一区二区三区四区毛片| 欧美日本亚洲| 国产精品成人国产乱| 欧美黑白配在线| 欧美日韩一区精品| 免费特级黄色片| 国产日本在线| 国产.精品.日韩.另类.中文.在线.播放| 海角国产乱辈乱精品视频| 谁有免费的黄色网址| 精品视频一区二区三区| 疯狂蹂躏欧美一区二区精品| 制服诱惑一区| 免费福利在线观看| 大桥未久av一区二区三区中文| 国产第一区电影| 久久免费黄色网址| 国产一区二区观看| 亚洲成人久久久久| 污污的网站免费| 人人视频精品| 亚洲国产精品影院| 自拍偷拍99| 国产中文在线视频| 成人毛片在线观看| 91精品视频免费| 少妇又紧又色又爽又刺激视频 | 欧美xxxxxxxxx| 欧美日韩在线观看不卡| 瑟瑟视频在线看| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧美一区二区原创| 久久久久久女乱国产| 不卡的看片网站| 岛国视频一区| 午夜精品无码一区二区三区| 精品影视av免费| 国产精品女人网站| 午夜久久久久久久久久影院| 日韩亚洲国产精品| 久久久久久久久久国产精品| 欧美黄色免费看| **女人18毛片一区二区| 色青青草原桃花久久综合| 精品成人无码一区二区三区| 蜜桃精品wwwmitaows| 日韩精品极品视频免费观看| 一区二区免费在线观看视频| 99re8这里有精品热视频免费| 欧美一区二区私人影院日本| 久久久久久综合网| **精品中文字幕一区二区三区| 欧美中文字幕亚洲一区二区va在线 | 在线看黄色av| 国产精品福利av| 中文字幕久精品免| av在线网址观看| 亚洲综合成人在线| av免费观看大全| 日本午夜大片a在线观看| 舔着乳尖日韩一区| 欧美三级一级片| www.com.cn成人| 日本高清不卡aⅴ免费网站| 成人在线激情网| 国产欧美自拍| 欧美一区二区视频观看视频 | 久久网站最新地址| 日韩电影大全在线观看| 98在线视频| 亚洲人成在线观看一区二区| www.99riav| 国产极品在线观看| 在线亚洲+欧美+日本专区| 欧美日韩中文不卡| 香蕉大人久久国产成人av| 亚洲成人av在线| 国产高潮呻吟久久| 欧美r级电影| 久久99热精品| 日本熟女毛茸茸| 激情久久久久久久久久久久久久久久| 亚洲一区二区三区sesese| 天天综合在线视频| 欧美国产在线观看| www.激情网| 免费福利视频一区二区三区| 欧美日韩国产精品成人| 男人女人拔萝卜视频| 一区二区小说| 欧美成人h版在线观看| 国产成人无码精品久在线观看 | 亚洲国产中文字幕在线视频综合| 国产精品欧美激情在线观看| 亚洲欧洲一二区| 亚洲国产精品专区久久| 精品在线观看一区| 99综合精品| 成人国产精品av| 视频午夜在线| 亚洲猫色日本管| 国产熟人av一二三区| 99re91这里只有精品| 中文字幕精品网| 中文字幕日韩一级| 国产精品综合视频| 日本一区视频在线| gogo高清在线播放免费| 欧美日韩第一区日日骚| 黄色国产在线观看| 欧美日韩精品| 国产精品色婷婷视频| 午夜一区在线观看| 亚洲美女屁股眼交3| www.亚洲高清| 久久超碰99| 久久免费精品视频| 国产av无码专区亚洲a∨毛片| 国产亚洲人成网站| koreanbj精品视频一区| 日本在线成人| 久久国产一区二区三区| 久久精品五月天| 99久久精品费精品国产一区二区| 成年人视频大全| 四虎影视国产精品| 在线色欧美三级视频| 中日韩精品视频在线观看| 国产999精品久久| 波多野结衣与黑人| 国产激情一区| 久久精品2019中文字幕| 特级西西444www高清大视频| 久久人人超碰精品| koreanbj精品视频一区| 久久精品国产亚洲AV无码男同| 欧美精品videosex牲欧美| 911福利视频| 国产99亚洲| 97视频色精品| 亚洲av成人无码久久精品老人 | 亚洲精品国精品久久99热| 欧美日韩在线视频免费| 国产精品一色哟哟哟| 综合操久久久| 精品国产一区二区三区性色av| 中文字幕在线看视频国产欧美在线看完整 | 人人狠狠综合久久亚洲婷| 欧美在线视频免费播放| 日韩精品视频在线观看一区二区三区| 亚洲第一主播视频| 国产xxxxxxxxx| 999在线观看精品免费不卡网站| 99在线视频免费观看| 免费污视频在线观看| 精品国产一区二区亚洲人成毛片| 九九热视频精品| 成人一区二区三区视频在线观看 | 欧美一级午夜免费电影| 欧美被狂躁喷白浆精品| 成人avav影音| 国产最新免费视频| 成人高清av| 91影视免费在线观看| 日本天码aⅴ片在线电影网站| 精品久久久久av影院| 日本黄色片视频| 久久久久国产一区二区三区四区 | 91精品影视| 日韩在线视频网| 亚洲第一成年人网站| 亚洲一区二区美女| 欧美黑人欧美精品刺激| 免费在线观看视频一区| 日本黄xxxxxxxxx100| 精品国产导航| 日韩免费视频在线观看| 黄色网址在线免费播放| 精品成人私密视频| 无码视频一区二区三区| 最新欧美精品一区二区三区| 天天躁日日躁狠狠躁av| 三级精品在线观看| 国产精品亚洲天堂| 美国成人xxx| 国产精品视频专区| 福利在线导航136| 亚洲欧洲国产精品| av综合在线观看| 精品国产户外野外| 国产精品1区2区3区4区| 国产91丝袜在线18| 亚洲这里只有精品| 亚洲成人中文| 一区二区免费在线观看| 开心激情综合| 91久久精品视频| 老司机2019福利精品视频导航| 免费不卡欧美自拍视频| 久久综合九色综合久| 欧美大片在线观看一区| 中文字幕一区二区三区四区欧美| 亚洲精品日产精品乱码不卡| 永久免费看mv网站入口78| 国产一区二区0| 久久久精品三级| 亚洲精选在线| 国产a级黄色大片| 欧美aaaa视频| 日韩资源av在线| 国产成人高清精品免费5388| 国产精品免费久久久久久| a天堂资源在线| 欧美风情在线观看| 欧美性猛交xxx乱大交3蜜桃| 亚洲成人久久一区| www.com在线观看| 精品视频在线免费看| 欧美不卡视频在线观看| 一区二区三区四区不卡在线 | 欧美做受高潮中文字幕| 久久99精品久久久久| 美女喷白浆视频| 水野朝阳av一区二区三区| 日本黄大片在线观看| 欧美二区不卡| 日本丰满少妇黄大片在线观看| 欧美理论在线播放| 欧美不卡在线一区二区三区| 国产精品一区二区三区美女| 99视频国产精品免费观看| 国产精品日本一区二区三区在线 | 亚洲成人手机在线| 激情五月少妇a| 亚洲另类中文字| 国产尤物在线播放| 亚洲品质自拍视频网站| 四虎地址8848| 自拍偷拍亚洲欧美日韩| 精品国产大片大片大片| 中文字幕亚洲精品在线观看| 少妇的滋味中文字幕bd| 国产精品美女久久久久久| 中文字幕第24页| 中文字幕av资源一区| 国产三级在线观看完整版| 亚洲国产精品激情在线观看| 人人妻人人澡人人爽| 欧美经典一区二区三区| 欧美另类z0zx974| 国产午夜亚洲精品理论片色戒 | 欧美一区二不卡视频| 亚洲精品福利免费在线观看| 亚洲三区在线观看无套内射| 精品一区精品二区| 精品美女视频在线观看免费软件| 亚洲美女视频网| 国产福利电影在线| 日韩在线视频网| 亚洲精品一线| 97免费在线视频| 激情开心成人网| 国产欧美日韩亚洲精品| 久久九九精品视频| 国产欧美日韩伦理| 国产精品免费大片| 自拍偷拍99| 怡红院精品视频在线观看极品| 女人和拘做爰正片视频| 日本中文字幕一区二区视频| 天天干天天操天天玩| 国产精品一区免费视频| 久久久午夜精品福利内容| 久久精品一区二区三区av| 国产精品视频看看| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧美一区二区三区在线观看| 欧美午夜免费电影| 精品国产av 无码一区二区三区| 亚洲电影免费观看高清完整版在线观看 | 日韩精品中文字幕久久臀| 91美女视频在线| 欧美激情精品久久久久久大尺度 | 色综合久久综合| 国产精品高潮呻吟AV无码| 精品av久久707| 国产在线91| 欧美国产一区二区三区| 中文字幕在线中文字幕在线中三区| 国产精品视频资源| 欧美一性一交| 性生活免费观看视频| 久久高清一区| 黑人巨大猛交丰满少妇| 国产亚洲欧洲一区高清在线观看| 欧美做爰爽爽爽爽爽爽| 色婷婷综合激情| 女人18毛片一区二区三区| 中文字幕国产亚洲2019| 久久影院午夜精品| 91视频国产高清| 精品国产一区二区三区噜噜噜| 人妻无码一区二区三区四区| 美女视频黄a大片欧美| 成人性生活免费看| 一区二区三区在线免费视频| 中文字幕av网站| 日韩av综合中文字幕| 91小视频xxxx网站在线| 国产精品黄视频| 人人精品亚洲| 日韩欧美精品免费| 精品一区二区三区日韩| 88久久精品无码一区二区毛片| 亚洲国产精品一区二区www在线 | 波多野结衣亚洲一二三| 97久久人人超碰caoprom欧美| 红桃成人av在线播放| 69堂免费视频| 成人深夜在线观看| 久久久久亚洲av成人片| 777a∨成人精品桃花网| 91在线网址| 国产精品69久久久久| 女同久久另类99精品国产| 免费拍拍拍网站| 国产成人啪午夜精品网站男同| 一本一本久久a久久| 欧美亚洲国产一区二区三区| 日本1级在线| 91av成人在线| 欧美色图五月天| 人人妻人人添人人爽欧美一区| 成人av免费观看| 国产真实乱偷精品视频| 精品久久久久久久久久久久久久久久久 | 91在线国产福利| 国产精品第九页| 亚洲精品91美女久久久久久久| 欧美理论片在线播放| 91精品国产99久久久久久红楼| 一区二区不卡| 先锋资源在线视频| 一区二区三区精品| 亚洲成人精品女人久久久| 欧美极品xxxx| 国产欧美三级电影| 成人免费毛片网| 久久久99久久| 中文字幕 日韩有码| 日韩中文字幕在线免费观看| 青娱乐极品盛宴一区二区| 致1999电视剧免费观看策驰影院| 国产一区二区三区四区五区美女| 欧美一区免费观看| 日韩精品一区二区三区三区免费 | 稀缺小u女呦精品呦| 精品久久久久久国产| 午夜小视频免费| 国产精品美女久久久久av超清| 第四色成人网| 国产乱叫456| 亚洲福利一二三区| 天堂av电影在线观看| 国产精品电影久久久久电影网| 四季av在线一区二区三区| 色18美女社区| 亚洲国产毛片aaaaa无费看 | 久久久免费精品视频| 日韩大胆成人| 在线免费视频a| 亚洲男人天堂av网| 日本美女一级片| 国产精品wwwwww| 亚洲综合色站| 疯狂揉花蒂控制高潮h| 欧美日韩一级二级三级| 日本性爱视频在线观看| 日本日本精品二区免费| 国内精品久久久久影院薰衣草| 国产在线观看成人| 亚洲人成在线播放| 国产精品一区二区精品视频观看| 精品视频免费在线播放| 国产精品毛片大码女人| 蜜桃av噜噜一区二区三区麻豆| 欧美一级免费视频| 色综合狠狠操| 国模无码视频一区| 欧美图区在线视频| 大香伊人中文字幕精品| 亚洲国产欧美不卡在线观看| 国产91在线观看丝袜| 中文字幕免费观看视频| 国内外成人免费激情在线视频| 成人婷婷网色偷偷亚洲男人的天堂| 国产免费无码一区二区| 欧美午夜精品久久久| 97在线超碰| a级网站在线观看|