色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:98日期:2022-08-11 10:59:39
目錄一、什么是ThreadLocal?二、ThreadLocal的使用場(chǎng)景三、如何使用ThreadLocal四、數(shù)據(jù)庫(kù)連接時(shí)的使用五、ThreadLocal工作原理六、小結(jié)七、注意點(diǎn)一、什么是ThreadLocal?

ThreadLocal叫做線程本地變量,ThreadLocal中填充的變量屬于當(dāng)前線程,該變量對(duì)其他線程而言是隔離的。ThreadLocal為變量在每個(gè)線程中都創(chuàng)建了一個(gè)副本,則每個(gè)線程都可以訪問(wèn)自己內(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ù)庫(kù)連接,Session會(huì)話管理。

三、如何使用ThreadLocal

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

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

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

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

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

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

五、ThreadLocal工作原理

ThreadLocal中的主要方法:

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

set方法

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

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

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

ThreadLocalMap就是ThreadLocal的一個(gè)靜態(tài)內(nèi)部類,里面定義了一個(gè)Entry來(lái)保存數(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()方法

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

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

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

remove()方法

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

從map中移除即可。

六、小結(jié)

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

2.ThreadLocalMap是ThreadLocal的內(nèi)部類,用Entry來(lái)進(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è),但是必須重寫(xiě)initialValue()方法。

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

七、注意點(diǎn)

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

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沒(méi)有了,但是value還在,這就造成了內(nèi)存泄漏。解決辦法:使用完ThreadLocal后,執(zhí)行remove操作,避免出現(xiàn)內(nèi)存溢出情況。

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧美a级毛片免费播敢 | 免费特黄| 国产亚洲精品精品国产亚洲综合 | 特黄特级a级黄毛片免费观看多人 | baby在线观看免费观看 | 亚洲免费视频一区二区三区 | 国产精品手机在线播放 | 996久久国产精品线观看 | 午夜性福| 国产特黄1级毛片 | 国产一级大片在线观看 | 女人张开腿让男人捅的视频 | 中文乱码字幕午夜无线观看 | 国产91精品久久久久久久 | 在线播放另类 | 国产欧美日韩在线视频 | 国产综合精品久久久久成人影 | 欧美一区二区三区不卡 | 国产成人在线影院 | 久久精品一区二区影院 | 成人合集大片bd高清在线观看 | 精品欧美高清不卡在线 | 亚洲一区免费观看 | 手机看片午夜 | a级片黄色片 | 亚洲精品一区二区久久这里 | 精品国产一区二区三区四区vr | 亚洲精品欧美精品一区二区 | 欧洲精品一区二区三区在线观看 | 在线亚洲日产一区二区 | 亚洲精品欧美精品 | 欧美三级在线观看不卡视频 | 成人免费视频网址 | 看真人视频a级毛片 | 欧美一区二区三区久久综合 | 性感毛片| 美女擦逼 | 日韩在线欧美在线 | 成人免费视频在线看 | 亚洲人成网站观看在线播放 | 欧美精品xxxⅹ欧美 欧美精品不卡 |