亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、什么是ThreadLocal?

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

二、ThreadLocal的使用場(chǎng)景

1.當(dāng)對(duì)象進(jìn)行跨層傳遞的時(shí)候,使用ThreadLocal可以避免多層傳遞,打破層次間的約束。

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

3.進(jìn)行事務(wù)操作,用于存儲(chǔ)線程事務(wù)信息。

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

三、如何使用ThreadLocal

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

五、ThreadLocal工作原理

ThreadLocal中的主要方法:

在這里插入圖片描述

set方法

在這里插入圖片描述

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

在這里插入圖片描述

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

ThreadLocalMap getMap(Thread t) {

   return t.threadLocals;

}

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

get()方法

在這里插入圖片描述

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

在這里插入圖片描述

remove()方法

在這里插入圖片描述

map中移除即可。

六、小結(jié)

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

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

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

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

5.在進(jìn)行g(shù)et之前,必須先set,否則會(huì)報(bào)空指針異常,當(dāng)然也可以初始化一個(gè),但是必須重寫initialValue()方法。

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

七、注意點(diǎn)

在這里插入圖片描述

1.Thread中有一個(gè)map,就是ThreadLocalMap

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

3.ThreadLocal是一個(gè)弱引用,當(dāng)為null時(shí),會(huì)被當(dāng)成垃圾回收。

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

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

相關(guān)文章

  • 實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作

    實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作

    這篇文章主要介紹了實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談多線程中的鎖的幾種用法總結(jié)(必看)

    淺談多線程中的鎖的幾種用法總結(jié)(必看)

    下面小編就為大家?guī)硪黄獪\談多線程中的鎖的幾種用法總結(jié)(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java并發(fā)編程中的阻塞隊(duì)列解析

    Java并發(fā)編程中的阻塞隊(duì)列解析

    這篇文章主要介紹了Java并發(fā)編程中的阻塞隊(duì)列解析,阻塞隊(duì)列BlockingQueue是一個(gè)支持兩個(gè)附加操作的隊(duì)列,這兩個(gè)附加的操作是在隊(duì)列為空時(shí),獲取元素的線程會(huì)等待隊(duì)列變?yōu)榉强?當(dāng)隊(duì)列滿時(shí),存儲(chǔ)元素的線程會(huì)等待隊(duì)列可用,需要的朋友可以參考下
    2023-08-08
  • Java設(shè)計(jì)模式中的橋接模式

    Java設(shè)計(jì)模式中的橋接模式

    這篇文章主要介紹了Java設(shè)計(jì)模式中的橋接模式,其是一種結(jié)構(gòu)型設(shè)計(jì)模式,是指將實(shí)現(xiàn)與抽象放在兩個(gè)不同的類層次中,使兩個(gè)層次可以獨(dú)立改變
    2022-07-07
  • Java基本概念監(jiān)視器實(shí)習(xí)原理解析

    Java基本概念監(jiān)視器實(shí)習(xí)原理解析

    這篇文章主要介紹了Java基本概念監(jiān)視器實(shí)習(xí)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 教你從頭開始用JAVA創(chuàng)建一個(gè)自己的簡(jiǎn)單API并實(shí)現(xiàn)第三方調(diào)用

    教你從頭開始用JAVA創(chuàng)建一個(gè)自己的簡(jiǎn)單API并實(shí)現(xiàn)第三方調(diào)用

    在日常開發(fā)的時(shí)候,經(jīng)常會(huì)遇到需要調(diào)用別人的接口的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何從頭開始用JAVA創(chuàng)建一個(gè)自己的簡(jiǎn)單API并實(shí)現(xiàn)第三方調(diào)用的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • SpringBoot結(jié)合Mybatis實(shí)現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法

    SpringBoot結(jié)合Mybatis實(shí)現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法

    本文主要介紹了SpringBoot結(jié)合Mybatis實(shí)現(xiàn)創(chuàng)建數(shù)據(jù)庫表的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring?BeanPostProcessor后處理器源碼解析

    Spring?BeanPostProcessor后處理器源碼解析

    這篇文章主要介紹了Spring?BeanPostProcessor后處理器源碼解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-09-09
  • spring cloud oauth2 feign 遇到的坑及解決

    spring cloud oauth2 feign 遇到的坑及解決

    這篇文章主要介紹了spring cloud oauth2 feign 遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java并發(fā)容器ConcurrentHashMap深入分析

    java并發(fā)容器ConcurrentHashMap深入分析

    這篇文章主要為大家介紹了java并發(fā)容器ConcurrentHashMap使用示例及深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論