精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲国产cao| 国产一区二区毛片| 亚洲免费av网址| 亚洲三级视频网站| 麻豆影视国产在线观看| 福利一区福利二区| 欧美一级大胆视频| 成年人视频软件| 99这里只有精品视频| 欧美性猛交xxxx乱大交| 国产精品99久久久久久大便| 视频污在线观看| 麻豆国产精品一区二区三区 | 三区视频在线观看| www欧美xxxx| 国产精品日韩成人| 成人做爰66片免费看网站| 51国产偷自视频区视频| 91成人免费| 亚洲欧美在线一区二区| 久久精品一二三四| 亚洲四虎影院| 午夜av电影一区| youjizz.com亚洲| 看电影就来5566av视频在线播放| 国产高清成人在线| 国产精品香蕉国产| 日本免费精品视频| 亚洲全部视频| 欧美另类极品videosbestfree| 日韩人妻无码精品综合区| 91成人午夜| 欧美一区二区三区思思人| 国产精品人人爽人人爽| 中文字幕乱码在线播放| 亚洲一二三专区| 国产人妻互换一区二区| 888av在线| 久久久777精品电影网影网| 国产免费一区| 亚洲第一视频在线| 国产精品亚洲人在线观看| 国产精品video| 色一情一乱一伦| 99xxxx成人网| 97欧美精品一区二区三区| 免费日韩在线视频| 久久精品一区二区不卡| 色偷偷噜噜噜亚洲男人| 五月激情四射婷婷| 凹凸成人精品亚洲精品密奴| 亚洲女人被黑人巨大进入| 久久精品女同亚洲女同13| 日韩成人久久| 日韩精品一区二区三区蜜臀 | 亚洲成人毛片| 欧美日韩精品欧美日韩精品一综合| 凹凸日日摸日日碰夜夜爽1| 性孕妇free特大另类| 欧美日韩午夜激情| 无码aⅴ精品一区二区三区浪潮| 91桃色在线| 午夜在线电影亚洲一区| 男人日女人下面视频| 中文字幕在线直播| 欧美午夜寂寞影院| 在线能看的av网站| 久久影院一区二区三区| 精品国产三级电影在线观看| 精品国产一区在线| 蜜桃一区二区| 日韩网站在线观看| 成熟的女同志hd| 亚洲手机视频| 欧美中在线观看| 中文字幕观看在线| 国产真实乱子伦精品视频| 99视频日韩| 午夜福利视频一区二区| 久久九九久久九九| 一区二区不卡在线视频 午夜欧美不卡' | 日韩一区二区三区免费看 | 久久久精品国产99久久精品芒果| 欧美一区国产一区| 激情影院在线观看| 夜夜爽夜夜爽精品视频| 黄色片视频在线免费观看| 欧美freesex| 欧美日韩大陆一区二区| 北条麻妃亚洲一区| 婷婷精品视频| 久久精彩免费视频| 日本一级黄色录像| 免费观看30秒视频久久| 亚洲自拍欧美另类| 欧美视频综合| 一区二区三区av电影| 色欲av无码一区二区人妻| 国产a亚洲精品| 欧美www视频| 美国黑人一级大黄| 国产一区日韩欧美| 国产精品老女人精品视频| 国产成人精品一区二三区四区五区| 99在线精品观看| 伊人av成人| 午夜激情在线播放| 日韩视频一区二区三区在线播放| 尤物视频最新网址| 欧美精品入口| 国产精品自拍偷拍视频| 午夜福利理论片在线观看| 亚洲视频在线一区观看| 激情六月丁香婷婷| 国产劲爆久久| 久久视频免费观看| 一级黄色在线观看| 成人福利在线看| 潘金莲一级淫片aaaaa免费看| 我爱我色成人网| 亚洲成人激情在线观看| 免费高清在线观看电视| 日本午夜精品一区二区三区电影| 超碰97在线人人| 日本精品一区二区三区在线播放| 亚洲午夜私人影院| 伦伦影院午夜理论片| 久久亚洲精品中文字幕蜜潮电影| 日本国产一区二区三区| 欧美一级片免费| 亚洲女同女同女同女同女同69| 亚洲综合色在线观看| 欧美美女在线直播| 久久久久国产精品www| 91免费视频播放| 欧美激情中文字幕| 欧美午夜性生活| 国产亚洲一区二区三区不卡| 2019日本中文字幕| 欧美一区二区在线观看视频| 一区二区三区中文在线| 亚洲精品无码久久久久久久| 91久久国产| 国产精品亚发布| 日韩黄色影院| 欧美日韩在线直播| 国产黄色录像片| 美女久久久精品| 午夜精品一区二区三区在线观看| 精品网站在线| 日韩在线播放视频| 国产女人18毛片水真多| 亚洲乱码中文字幕| 韩国三级hd中文字幕有哪些| 99精品视频精品精品视频| 国产美女高潮久久白浆| 免费a级人成a大片在线观看| 欧美军同video69gay| 天天舔天天操天天干| 免费高清不卡av| 黄瓜视频免费观看在线观看www| 91国产精品| 免费不卡在线观看av| 午夜精品久久久久久久99热黄桃| 一区二区三区加勒比av| 日韩精品视频一区二区| 国产亚洲网站| 天堂社区 天堂综合网 天堂资源最新版 | 九一国产精品| 国产精品久久久久久久久免费| 2019中文字幕在线视频| 日韩欧美区一区二| 日韩黄色a级片| 久久精品欧美日韩| 女人高潮一级片| 黄色免费成人| 欧洲一区二区在线| 99精品国产九九国产精品| 欧美日韩福利在线观看| 亚洲AV第二区国产精品| 欧美日韩一区二区电影| 精品无码人妻一区二区三区| 久久久综合视频| 成人黄色一级大片| 91久久在线| 天堂√在线观看一区二区| 精品午夜av| 欧日韩不卡在线视频| 日本在线免费看| 日韩精品欧美国产精品忘忧草 | 日韩欧美一区二区三区久久婷婷| 国产精品成人**免费视频| 午夜精品一区二区三区在线视频| 国产黄色在线播放| 亚洲精品一区二区三区影院| 一级特黄免费视频| 一区二区激情视频| 舐め犯し波多野结衣在线观看| 国产精品一区在线观看乱码| 大陆极品少妇内射aaaaa| 98精品视频| 免费av一区二区三区| 精品国产一级| 国产精品久久久久久av下载红粉 | 亚洲精品美腿丝袜| 瑟瑟视频在线观看| 国产美女精品在线| 国内外免费激情视频| 欧美片第1页综合| 亚洲精品成人自拍| 全国精品免费看| 91手机在线播放| jizz亚洲女人高潮大叫| 91成人精品网站| 人交獸av完整版在线观看| 日韩在线中文视频| 免费在线一级视频| 亚洲第一精品夜夜躁人人躁| 国产色综合视频| 欧美三级韩国三级日本一级| 国产精品久久久久久久久久精爆| 亚洲一区在线观看免费| 亚洲xxxx3d动漫| 国产精品欧美一区二区三区| 欧美激情aaa| www.日韩在线| 特种兵之深入敌后| 韩日精品视频一区| 国产九九在线观看| 日韩—二三区免费观看av| 午夜精品久久久久久久无码| 国产精品红桃| 国产美女永久无遮挡| 在线电影一区二区| 最近中文字幕免费mv| 日韩精品四区| 先锋在线资源一区二区三区| 九九热精品视频在线观看| 免费精品视频一区二区三区| 久久久久观看| 久久久综合亚洲91久久98| 欧美电影在线观看完整版| 动漫精品视频| 国产精品久久久网站| 国产一级二级三级精品| 色狠狠久久av综合| 蜜桃视频在线观看91| 国产一区国产二区国产三区| 日本欧美色综合网站免费| 国产成人三级| 日本在线观看一区二区| 欧美日韩一二三四| 亚洲 国产 欧美一区| 久久精品高清| 熟女视频一区二区三区| 欧美在线亚洲| 国产一二三区在线播放| 夜夜嗨一区二区| 亚洲熟女乱色一区二区三区| 手机精品视频在线观看| 91蝌蚪视频在线观看| 麻豆成人免费电影| 三级av免费看| 成人免费高清视频| 成人免费看aa片| 国产欧美日韩亚州综合| 看黄色录像一级片| 亚洲综合无码一区二区| 国产成人亚洲欧洲在线| 在线观看日韩高清av| 国产精品久久久久久在线| 日韩一区二区三区在线| 日韩一卡二卡在线| 伊人青青综合网站| 中文在线免费| 2019中文字幕免费视频| 巨大黑人极品videos精品| 2014亚洲精品| 日日天天久久| 国产高清免费在线| 中国女人久久久| 黄色手机在线视频| 国产成人av一区二区三区在线 | 亚洲成a人片在线| 日韩成人网免费视频| 中文字幕在线视频区| 欧美日韩xxxxx| 日韩影片中文字幕| 亚洲影院色无极综合| 亚洲男人都懂第一日本| 五月天在线免费视频| 国产免费成人| 九九九九九九九九| 91麻豆免费观看| 91久久久久久久久久久久久久| 午夜欧美一区二区三区在线播放| 特级西西444www大胆免费看| 精品动漫一区二区三区在线观看| 超碰在线影院| 69av在线播放| 欧美日韩黄网站| 日韩精彩视频| 亚洲欧洲一区| 中文字幕av一区二区三区人妻少妇| 久久婷婷色综合| 精品一区二区三区四| 欧美日韩夫妻久久| 可以在线观看的黄色| 97视频免费看| 无人区乱码一区二区三区| 亚洲高清乱码| 欧美亚洲网站| fc2成人免费视频| 亚洲欧美另类综合偷拍| 色婷婷久久综合中文久久蜜桃av| 精品成人在线观看| 欧美性天天影视| 国产精品高精视频免费| 精品自拍偷拍| 欧美图片激情小说| 国产精品99久久久久久宅男| 国产在视频线精品视频| 欧美日韩国产专区| 欧美熟妇另类久久久久久不卡| 欧美成人精品h版在线观看| 成人毛片免费| 神马影院午夜我不卡影院| 午夜宅男久久久| 波多野结衣有码| 亚洲福利一区二区| 懂色av蜜臀av粉嫩av分享吧| 欧美多人乱p欧美4p久久| 99精品在线免费观看| 亚洲一区二区三区加勒比| 日韩中文字幕亚洲一区二区va在线| 亚洲久久久久久| 亚洲午夜在线电影| 欧美 日韩 国产 成人 在线 91| 欧美老女人在线视频| 日韩一区网站| 日本高清视频免费在线观看| 国产尤物一区二区在线| 三级在线观看免费大全| 欧美精品一级二级三级| 日韩在线观看www| 91精品久久久久久久久久久| 久久国产亚洲精品| 免费一区二区三区在线观看| 国产精品美女一区二区| 一级黄色免费片| www.国产一区| 久久免费福利| 日本手机在线视频| 97久久精品人人爽人人爽蜜臀| 日本熟妇乱子伦xxxx| 亚洲精品电影久久久| 精品丝袜在线| 清纯唯美一区二区三区| 毛片不卡一区二区| 国产精品国产精品88| 日韩精品中文字幕在线不卡尤物| 欧美人与禽性xxxxx杂性| 狠狠综合久久av| 久久精品一区二区国产| ass极品国模人体欣赏| 91精品国产一区二区| 搞黄网站在线看| 美媛馆国产精品一区二区| 日韩影院免费视频| 最新一区二区三区| 欧美精品一区男女天堂| 成人性教育av免费网址| 亚洲免费视频一区| 国产成人精品三级| 九九热精品视频在线| 日韩一区二区三区xxxx| 第一区第二区在线| 乱子伦视频在线看| 亚洲少妇30p| 亚洲 国产 欧美 日韩| 国产精品久久久久久婷婷天堂| 91精品国产视频| 性囗交免费视频观看| 欧美亚洲综合网| 污视频网站免费在线观看| 久久久久se| 国产综合色在线| 久久午夜免费视频| 最近2019年手机中文字幕| 成人看片黄a免费看视频| 无码日韩人妻精品久久蜜桃| 亚洲另类在线制服丝袜| 欧美女子与性| 91一区二区三区| 日韩电影免费在线看| 久久精品欧美一区二区| 日韩在线视频二区| 日韩在线你懂的| www.四虎精品| 欧美日韩aaaaaa|