最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程之ThreadLocal詳解

 更新時間:2021年06月04日 14:53:58   作者:想當程序媛的秀妍  
今天給大家?guī)淼氖荍ava并發(fā)編程的相關知識,文中對ThreadLocal做了非常詳細的分析及介紹,對小伙伴們很有幫助,需要的朋友可以參考下

一、什么是ThreadLocal?

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

二、ThreadLocal的使用場景

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

2.線程間數(shù)據(jù)隔離。

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

4.數(shù)據(jù)庫連接,Session會話管理。

三、如何使用ThreadLocal

ThreadLocal的作用是每一個線程創(chuàng)建一個副本。

在這里插入圖片描述

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

四、數(shù)據(jù)庫連接時的使用

在這里插入圖片描述

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

五、ThreadLocal工作原理

ThreadLocal中的主要方法:

在這里插入圖片描述

set方法

在這里插入圖片描述

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

在這里插入圖片描述

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

ThreadLocalMap getMap(Thread t) {

   return t.threadLocals;

}

調(diào)用當前線程t,返回當前線程t中的成員變量threadLocals,threadLocals就是ThreadLocalMap

get()方法

在這里插入圖片描述

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

在這里插入圖片描述

remove()方法

在這里插入圖片描述

map中移除即可。

六、小結

1.每個Thread內(nèi)部都維護著一個ThreadLocalMap的引用

2.ThreadLocalMap是ThreadLocal的內(nèi)部類,用Entry來進行存儲

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

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

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

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

七、注意點

在這里插入圖片描述

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

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

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

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

到此這篇關于Java并發(fā)編程之ThreadLocal詳解的文章就介紹到這了,更多相關Java ThreadLocal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java項目打包Docker鏡像全流程

    Java項目打包Docker鏡像全流程

    本文是一份超詳細的Java項目Docker化實戰(zhàn)手冊,從環(huán)境準備到最終上線,手把手帶你完成整個容器化部署流程,無論你是剛接觸Docker的新手,還是想系統(tǒng)梳理容器化流程的開發(fā)者,這篇文章都能給你帶來實實在在的幫助,需要的朋友可以參考下
    2025-04-04
  • java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例

    java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例

    這篇文章主要介紹了java實現(xiàn)的日期時間轉(zhuǎn)換工具類,結合完整實例形式分析了java針對日期時間常見的轉(zhuǎn)換、計算、格式化等相關操作與封裝技巧,需要的朋友可以參考下
    2019-10-10
  • springboot?Long?精度丟失問題解決

    springboot?Long?精度丟失問題解決

    這篇文章主要為大家介紹了解決springboot?Long?精度丟失問題的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • java壓縮多個文件并且返回流示例

    java壓縮多個文件并且返回流示例

    這篇文章主要介紹了java壓縮多個文件并且返回流示例,返回壓縮流主是為了在程序里再做其它操作,需要的朋友可以參考下
    2014-03-03
  • Eclipse 出現(xiàn)Failed to load JavaHL Library解決方法

    Eclipse 出現(xiàn)Failed to load JavaHL Library解決方法

    這篇文章主要介紹了Eclipse 出現(xiàn)Failed to load JavaHL Library解決方法的相關資料,今天使用Eclipse 時出現(xiàn)以上錯誤,本文說明如何更更正,需要的朋友可以參考下
    2016-11-11
  • 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法

    使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法

    這篇文章主要介紹了使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法,這也是各大計算機考試和ACM以及面試的常見基礎問題,需要的朋友可以參考下
    2015-08-08
  • 基于ElasticSearch Analyzer的使用規(guī)則詳解

    基于ElasticSearch Analyzer的使用規(guī)則詳解

    這篇文章主要介紹了基于ElasticSearch Analyzer的使用規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java線程Dump分析工具jstack解析及使用場景

    Java線程Dump分析工具jstack解析及使用場景

    這篇文章主要介紹了Java線程Dump分析工具jstack解析及使用場景,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java BigDecimal使用方法詳解

    Java BigDecimal使用方法詳解

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。雙精度浮點型變量double可以處理16位有效數(shù),但在實際應用中,可能需要對更大或者更小的數(shù)進行運算和處理
    2022-12-12
  • SpringBoot結合Redis哨兵模式的實現(xiàn)示例

    SpringBoot結合Redis哨兵模式的實現(xiàn)示例

    這篇文章主要介紹了SpringBoot結合Redis哨兵模式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論

房产| 孟连| 来安县| 南和县| 河东区| 临桂县| 虎林市| 呼伦贝尔市| 道真| 上栗县| 丹阳市| 泗阳县| 正镶白旗| 普兰店市| 阳泉市| 高尔夫| 惠水县| 汉源县| 武陟县| 孟州市| 兰坪| 双峰县| 林州市| 临邑县| 武平县| 措美县| 呼玛县| 双江| 竹山县| 故城县| 合肥市| 松桃| 修水县| 江孜县| 房山区| 湘乡市| 十堰市| 彝良县| 新竹县| 浠水县| 洮南市|