亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Java并發編程之ThreadLocal詳解

瀏覽:110日期:2022-08-11 10:59:39
目錄一、什么是ThreadLocal?二、ThreadLocal的使用場景三、如何使用ThreadLocal四、數據庫連接時的使用五、ThreadLocal工作原理六、小結七、注意點一、什么是ThreadLocal?

ThreadLocal叫做線程本地變量,ThreadLocal中填充的變量屬于當前線程,該變量對其他線程而言是隔離的。ThreadLocal為變量在每個線程中都創建了一個副本,則每個線程都可以訪問自己內部的副本變量。

二、ThreadLocal的使用場景

1.當對象進行跨層傳遞的時候,使用ThreadLocal可以避免多層傳遞,打破層次間的約束。

2.線程間數據隔離。

3.進行事務操作,用于存儲線程事務信息。

4.數據庫連接,Session會話管理。

三、如何使用ThreadLocal

ThreadLocal的作用是每一個線程創建一個副本。

Java并發編程之ThreadLocal詳解

從以上實例中可以看出,每一個線程都有自己的local值,設置一個休眠時間就是為了另外一個線程也能夠及時的讀取當前的local值。

四、數據庫連接時的使用

Java并發編程之ThreadLocal詳解

上面是一個數據庫連接的管理類,使用數據庫的時候首先就是建立數據庫連接,然后用完之后進行關閉,這里存在一個問題:如果1個客戶端頻繁的使用數據庫,那么就需要建立多次連接和關閉,這樣服務器可能會吃不消,如果有一萬個客戶端,服務器的壓力更大。這個時候就可以使用ThreadLocal,他會在每個線程中對連接創建一個副本,且在線程內部任何地方都可以使用,線程之間互不影響,這樣一來就不存在線程安全問題,也不會嚴重影響程序執行性能。

五、ThreadLocal工作原理

ThreadLocal中的主要方法:

Java并發編程之ThreadLocal詳解

set方法

Java并發編程之ThreadLocal詳解

首先獲取到當前線程t,然后調用getMap獲取ThreadLocalMap,如果map存在,則將當前線程對象作為key,要存儲的對象作為value存到map中去,如果該map不存在,則初始化一個。ThreadLocalMap:

Java并發編程之ThreadLocal詳解

ThreadLocalMap就是ThreadLocal的一個靜態內部類,里面定義了一個Entry來保存數據,而且還是繼承的弱引用。在Entry內部使用了ThreadLocal作為key,使用我們設置的value作為value。getMap方法:

ThreadLocalMap getMap(Thread t) { return t.threadLocals;}

調用當前線程t,返回當前線程t中的成員變量threadLocals,threadLocals就是ThreadLocalMap。

get()方法

Java并發編程之ThreadLocal詳解

首先獲取當前線程,然后調用getMap方法獲取一個ThreadLocalMap,如果map不為null,那就使用當前線程作為ThreadLocalMap的Entry的鍵,然后值就作為相應的值,如果沒有就設置一個初始值。設置初始值:

Java并發編程之ThreadLocal詳解

remove()方法

Java并發編程之ThreadLocal詳解

從map中移除即可。

六、小結

1.每個Thread內部都維護著一個ThreadLocalMap的引用

2.ThreadLocalMap是ThreadLocal的內部類,用Entry來進行存儲

3.ThreadLocal創建的副本是存儲在自己的threadLocals中的,也就是自己的ThreadLocalMap

4.ThreadLocalMap的鍵值為ThreadLocal對象,而且可以有多個threadLocals變量,因此保存在map中。

5.在進行get之前,必須先set,否則會報空指針異常,當然也可以初始化一個,但是必須重寫initialValue()方法。

6.ThreadLocal本身并不存儲值,他只是作為一個key來讓線程從ThreadLocalMap獲取value。

七、注意點

Java并發編程之ThreadLocal詳解

1.Thread中有一個map,就是ThreadLocalMap

2.ThreadLocalMap的key是ThreadLocal,值是我們自己設定的。

3.ThreadLocal是一個弱引用,當為null時,會被當成垃圾回收。

4.如果我們ThreadLocal是null了,也就是要被垃圾回收器回收了,但是此時我們的ThreadLocalMap生命周期和Thread的一樣,他不會回收,這時候就出現一個現象,就是ThreadLocalMap的key沒有了,但是value還在,這就造成了內存泄漏。解決辦法:使用完ThreadLocal后,執行remove操作,避免出現內存溢出情況。

到此這篇關于Java并發編程之ThreadLocal詳解的文章就介紹到這了,更多相關Java ThreadLocal內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 国产黑色丝袜在线播放 | 91国内精品线免费播放 | 91麻豆传传媒波多野衣久久看 | 亚洲国产第一区二区香蕉 | 国产理论 | 一级毛片在线看 | 亚洲天堂三区 | xxxxx亚洲| 欧美特级限制片高清 | 亚洲欧美大片 | 国产精品黄大片观看 | 亚洲精品老司机福利在线播放 | 色偷偷亚洲第一成人综合网址 | 一级色网站 | 亚洲欧美日韩国产一区二区精品 | 国产精品国产香蕉在线观看网 | 国产高清一级毛片 | 国产精选第一页 | 亚洲欧美一区二区三区久本道 | 免费播放国产一级 | 特黄特色的视频免费播放 | 久草网免费| 国产闫盼盼私拍福利精品视频 | 50-60岁老妇女一级毛片 | 正在播放国产会所按摩视频 | 国产精品国产香蕉在线观看网 | 欧美毛片 | 国产一级二级三级毛片 | 岛国视频在线观看免费播放 | 夜色成人 | 三级黄色在线视频中文 | 亚洲欧洲一二三区机械有限公司 | 成人免费草草视频 | 高清一本视频在线观看 | 高h喷水荡肉爽文各种场合 高h辣肉各种姿势爽文bl | 视频在线一区二区三区 | 麻豆网在线观看 | 国内自拍视频在线看免费观看 | 热久久国产欧美一区二区精品 | 国产精品拍自在线观看 | 大香焦久久 |