日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

京東二面:為什么Netty要?jiǎng)?chuàng)造FastThreadLocal?

來(lái)源: 責(zé)編: 時(shí)間:2024-05-29 08:58:42 200觀(guān)看
導(dǎo)讀FastThreadLocal 從字面意義上來(lái)看,它是“Fast”+“ThreadLocal”的結(jié)合體,寓意為快速的 ThreadLocal。那么,問(wèn)題來(lái)了,Netty 為什么要再造一個(gè) FastThreadLocal?FastThreadLocal 運(yùn)行快的原因是啥?除了快之外,它還有其他優(yōu)勢(shì)

W4T28資訊網(wǎng)——每日最新資訊28at.com

FastThreadLocal 從字面意義上來(lái)看,它是“Fast”+“ThreadLocal”的結(jié)合體,寓意為快速的 ThreadLocal。那么,問(wèn)題來(lái)了,Netty 為什么要再造一個(gè) FastThreadLocal?FastThreadLocal 運(yùn)行快的原因是啥?除了快之外,它還有其他優(yōu)勢(shì)嗎?W4T28資訊網(wǎng)——每日最新資訊28at.com

1.先從ThreadLocal說(shuō)起

ThreadLocal 線(xiàn)程本地變量,每個(gè)線(xiàn)程都擁有一份該變量的獨(dú)立副本,即使是在多線(xiàn)程環(huán)境下,每個(gè)線(xiàn)程也只能修改和訪(fǎng)問(wèn)自己的那份副本,從而避免了線(xiàn)程安全問(wèn)題,實(shí)現(xiàn)了線(xiàn)程間的隔離。W4T28資訊網(wǎng)——每日最新資訊28at.com

ThreadLocal 底層是使用 ThreadLocalMap 實(shí)現(xiàn)的,這點(diǎn)從 JDK 的源碼中可以看出,核心源碼如下:W4T28資訊網(wǎng)——每日最新資訊28at.com

private void set(Thread t, T value) {    ThreadLocalMap map = getMap(t);    if (map != null) {        map.set(this, value);    } else {        createMap(t, value);    }}

從 ThreadLocal 的 set 方法可以看出,ThreadLocal 是存儲(chǔ)在 ThreadLocalMap 中的,咱們繼續(xù)看 ThreadLocalMap 的源碼實(shí)現(xiàn):W4T28資訊網(wǎng)——每日最新資訊28at.com

W4T28資訊網(wǎng)——每日最新資訊28at.com

從上面源碼可以看出,ThreadLocalMap 中存放的是 Entry(哈希桶),而 Entry 中的 key 就是 ThreadLocal,而 value 則是要存儲(chǔ)的值,所以我們得出 ThreadLocal 的底層實(shí)現(xiàn)如下:W4T28資訊網(wǎng)——每日最新資訊28at.com

W4T28資訊網(wǎng)——每日最新資訊28at.com

2.ThreadLocal存在的問(wèn)題

(1)性能問(wèn)題

因?yàn)?ThreadLocal 底層是使用 ThreadLocalMap 實(shí)現(xiàn)的,ThreadLocalMap 類(lèi)似于哈希表。當(dāng)一個(gè)線(xiàn)程是擁有多個(gè) ThreadLocal 時(shí),ThreadLocalMap 很容易發(fā)生 Hash 沖突,此時(shí) ThreadLocal 就不得不使用線(xiàn)性探測(cè)法來(lái)解決哈希沖突了,而在解決 Hash 沖突時(shí)需要不停地向下尋找,效率較低,因此 ThreadLocal 存在的第一個(gè)問(wèn)題就是性能較低。W4T28資訊網(wǎng)——每日最新資訊28at.com

(2)內(nèi)存泄漏問(wèn)題

ThreadLocal 也存在內(nèi)存泄漏的問(wèn)題,具體來(lái)說(shuō) ThreadLocalMap 使用 ThreadLocal 對(duì)象作為鍵(Key),并且這個(gè)鍵是弱引用(WeakReference)類(lèi)型。這意味著當(dāng)沒(méi)有其他強(qiáng)引用指向 ThreadLocal 對(duì)象時(shí),它將會(huì)在下次垃圾回收時(shí)被回收。然而,Entry 中保存的值(Value)仍然是強(qiáng)引用,這就可能導(dǎo)致以下問(wèn)題:W4T28資訊網(wǎng)——每日最新資訊28at.com

  • 弱引用鍵的回收:一旦外部對(duì) ThreadLocal 實(shí)例的所有強(qiáng)引用消失,ThreadLocal 對(duì)象本身就會(huì)變?yōu)槿蹩蛇_(dá)狀態(tài)。在下一次垃圾回收時(shí),由于是弱引用,ThreadLocal 對(duì)象會(huì)被回收,但 Entry 中的 Value(即實(shí)際存儲(chǔ)的數(shù)據(jù))仍然是強(qiáng)引用,因此不會(huì)被回收。
  • Map 引用陷阱:即使 ThreadLocal 鍵被回收,Entry 仍然存在于 ThreadLocalMap 中,并且由于 Map 對(duì) Entry 的引用,這些 Entry 所持有的 Value 對(duì)象也不會(huì)被垃圾回收,從而導(dǎo)致這些對(duì)象無(wú)法被使用也無(wú)法被釋放,形成了所謂的“內(nèi)存泄漏”。
  • 線(xiàn)程長(zhǎng)期存活:在一些場(chǎng)景下,特別是使用線(xiàn)程池時(shí),線(xiàn)程的生命周期往往很長(zhǎng),甚至伴隨整個(gè)應(yīng)用的生命周期。這意味著 ThreadLocalMap 中的 Entry 可能會(huì)長(zhǎng)時(shí)間不被清理,進(jìn)一步加劇了內(nèi)存泄漏問(wèn)題。

所以,綜合來(lái)看,在使用 ThreadLocal 時(shí),如果在使用完之后,未及時(shí)調(diào)用 remove() 方法的話(huà),就會(huì)出現(xiàn)內(nèi)存泄漏的問(wèn)題。W4T28資訊網(wǎng)——每日最新資訊28at.com

3.FastThreadLocal特點(diǎn)

為了解決 ThreadLocal 存在的這些問(wèn)題,所以 Netty 創(chuàng)造出了一個(gè) FastThreadLocal,F(xiàn)astThreadLocal 的特點(diǎn)如下。W4T28資訊網(wǎng)——每日最新資訊28at.com

(1)效率高

FastThreadLocal 之所以性能高的原因是因?yàn)槠浯鎯?chǔ)結(jié)構(gòu),在 FastThreadLocal 中并沒(méi)有向 ThreadLocal 那樣,使用哈希表來(lái)存儲(chǔ)元素,而是使用了數(shù)組來(lái)進(jìn)行元素存儲(chǔ),它的核心實(shí)現(xiàn)源碼如下:W4T28資訊網(wǎng)——每日最新資訊28at.com

public class FastThreadLocal<V> {    // FastThreadLocal中的index是記錄了該它維護(hù)的數(shù)據(jù)應(yīng)該存儲(chǔ)的位置    // InternalThreadLocalMap數(shù)組中的下標(biāo), 它是在構(gòu)造函數(shù)中確定的    private final int index;     public InternalThreadLocal() {        index = InternalThreadLocalMap.nextVariableIndex();    }    // 省略其他代碼}

FastThreadLocal 核心類(lèi) InternalThreadLocalMap 的實(shí)現(xiàn)源碼如下:W4T28資訊網(wǎng)——每日最新資訊28at.com

public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap {    // 自增索引, ?于計(jì)算下次存儲(chǔ)到Object數(shù)組中的位置    private static final AtomicInteger nextIndex = new AtomicInteger();     private static final int ARRAY_LIST_CAPACITY_MAX_SIZE = Integer.MAX_VALUE - 8;     public static int nextVariableIndex() {        int index = nextIndex.getAndIncrement();        if (index >= ARRAY_LIST_CAPACITY_MAX_SIZE || index < 0) {            nextIndex.set(ARRAY_LIST_CAPACITY_MAX_SIZE);            throw new IllegalStateException("too many thread-local indexed variables");        }        return index;    }    // 省略其他代碼}

從上述源碼可以看出,F(xiàn)astThreadLocal 在初始化的時(shí)候分配一個(gè)數(shù)組索引 index,index 的值采用原子類(lèi) AtomicInteger 保證順序遞增,通過(guò)調(diào)用 InternalThreadLocalMap.nextVariableIndex() 方法獲得。然后在讀寫(xiě)數(shù)據(jù)的時(shí)候通過(guò)數(shù)組下標(biāo) index 直接定位到 FastThreadLocal 的位置,時(shí)間復(fù)雜度為 O(1)。如果數(shù)組下標(biāo)遞增到非常大,那么數(shù)組也會(huì)比較大,所以 FastThreadLocal 是通過(guò)空間換時(shí)間的思想提升讀寫(xiě)性能。W4T28資訊網(wǎng)——每日最新資訊28at.com

因此,在 FastThreadLocal 中并不需要使用線(xiàn)性探測(cè)法來(lái)解決 Hash 沖突,因?yàn)樗鞘褂脭?shù)組進(jìn)行存儲(chǔ)的,每次使用下標(biāo)進(jìn)行查詢(xún)即可,它的查詢(xún)時(shí)間復(fù)雜度也是 O(1) 的,所以它的操作效率很高。W4T28資訊網(wǎng)——每日最新資訊28at.com

(2)安全性更高

JDK 原生的 ThreadLocal 使用不當(dāng)可能造成內(nèi)存泄漏,只能等待線(xiàn)程銷(xiāo)毀。然而 FastThreadLocal 卻不存在這個(gè)問(wèn)題,在 FastThreadLocal 中不僅提供了 remove() 方法可以主動(dòng)清除對(duì)象,而且它還封裝了 FastThreadLocalRunnable,F(xiàn)astThreadLocalRunnable 在最后使用完之后會(huì)自動(dòng)調(diào)用 removeAll() 方法將集合中所有對(duì)象清理掉,因此 FastThreadLocal 更安全。W4T28資訊網(wǎng)——每日最新資訊28at.com

FastThreadLocalRunnable 自動(dòng)清除對(duì)象的實(shí)現(xiàn)核心源碼如下:W4T28資訊網(wǎng)——每日最新資訊28at.com

final class FastThreadLocalRunnable implements Runnable {    private final Runnable runnable;    @Override    public void run() {        try {            runnable.run();        } finally {            FastThreadLocal.removeAll();        }    }    static Runnable wrap(Runnable runnable) {        return runnable instanceof FastThreadLocalRunnable                 ? runnable : new FastThreadLocalRunnable(runnable);    }}

4.小結(jié)

FastThreadLocal 相比于 ThreadLocal 存在以下兩個(gè)主要優(yōu)點(diǎn):W4T28資訊網(wǎng)——每日最新資訊28at.com

  • 性能更高:FastThreadLocal 使用了數(shù)組的方式來(lái)存儲(chǔ)元素,所以它的查詢(xún)時(shí)間復(fù)雜度 O(1) 相比于 ThreadLocal 的哈希表操作效率更高。
  • 安全性更高:FastThreadLocal 中的 FastThreadLocalRunnable 在最后執(zhí)行完之后會(huì)自動(dòng)調(diào)用 removeAll() 將集合中所有對(duì)象都清理掉,可以避免內(nèi)存泄漏的問(wèn)題,所以它的安全性更高。

本文鏈接:http://m.www897cc.com/showinfo-26-91377-0.html京東二面:為什么Netty要?jiǎng)?chuàng)造FastThreadLocal?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot多租戶(hù)三種架構(gòu)實(shí)現(xiàn)方案詳解

下一篇: Git 不要只會(huì) Pull 和 Push,這五條提高效率的命令得掌握!

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久综合九九| 一区二区三区毛片| 国产一区二区三区免费观看| 国产网站欧美日韩免费精品在线观看| 狠狠色狠狠色综合人人| 91久久综合亚洲鲁鲁五月天| 亚洲卡通欧美制服中文| 亚洲欧美日韩精品综合在线观看| 久久久久久9| 欧美激情一区二区| 欧美日韩一区二区视频在线| 国产日韩一区二区三区在线播放 | 欧美激情综合色综合啪啪| 欧美系列亚洲系列| 黄色日韩在线| 99亚洲视频| 久久精品视频免费播放| 欧美经典一区二区三区| 国产麻豆91精品| 亚洲精品美女免费| 亚洲欧美在线磁力| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美视频在线一区二区三区| 国产伊人精品| 一区二区三区四区五区精品| 久久久精品一品道一区| 欧美午夜性色大片在线观看| 在线观看日韩专区| 午夜精品成人在线视频| 欧美黄免费看| 韩日午夜在线资源一区二区| 一区二区三区四区精品| 老司机亚洲精品| 国产精品最新自拍| 99精品福利视频| 久久综合综合久久综合| 国产欧美日韩免费| 一区二区高清视频| 欧美不卡福利| 黄色成人在线观看| 午夜精品久久久久久久男人的天堂| 欧美黄在线观看| 伊人夜夜躁av伊人久久| 午夜一区二区三区不卡视频| 欧美日韩免费一区二区三区| 亚洲国产欧美在线人成| 久久久久久久久一区二区| 国产麻豆精品theporn| 这里只有精品视频在线| 欧美精品免费在线| 亚洲第一色在线| 久久激情视频| 国产日韩欧美制服另类| 亚洲一区不卡| 欧美日韩免费在线观看| 最新国产成人在线观看| 另类天堂av| 狠狠综合久久av一区二区老牛| 午夜视频一区二区| 国产精品美女久久久| 一本色道久久综合狠狠躁篇的优点 | 亚洲欧美一级二级三级| 欧美日本精品在线| 91久久精品美女| 久久亚洲影院| 韩国精品久久久999| 午夜视频一区在线观看| 国产精品久久久久99| 亚洲色图自拍| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 国产曰批免费观看久久久| 亚洲在线免费| 国产精品成人v| 在线视频精品一| 欧美日韩精品综合| 日韩亚洲视频在线| 欧美日韩国产经典色站一区二区三区| 亚洲第一中文字幕| 欧美 日韩 国产一区二区在线视频 | 国产精品s色| 一本色道88久久加勒比精品 | 亚洲欧洲av一区二区| 国产精品久久久对白| 在线中文字幕一区| 欧美性淫爽ww久久久久无| 亚洲一区二区日本| 国产精品综合不卡av| 久久精品国产69国产精品亚洲| 国内精品久久久久久久果冻传媒| 久久精品av麻豆的观看方式| 激情视频一区| 美女视频一区免费观看| 亚洲国产片色| 欧美日韩精品一区二区在线播放| 亚洲调教视频在线观看| 国产欧美丝祙| 久久婷婷丁香| 亚洲欧洲日本在线| 欧美视频一区在线| 午夜精品久久久久久久99黑人| 国产区精品视频| 久久精品在线观看| 亚洲国产精品久久| 欧美日韩精品一区二区三区| 亚洲免费伊人电影在线观看av| 国产欧美日韩综合| 麻豆精品91| 亚洲最黄网站| 国产精品永久入口久久久| 久久久.com| 亚洲韩国日本中文字幕| 欧美视频在线不卡| 欧美一区二区三区四区视频| 永久91嫩草亚洲精品人人| 欧美日产在线观看| 午夜精品福利一区二区三区av| 韩国av一区二区三区| 欧美日韩91| 久久成人精品视频| 亚洲美女视频网| 国产一区二区剧情av在线| 欧美激情91| 午夜天堂精品久久久久| 亚洲高清视频的网址| 欧美午夜视频在线| 久久视频国产精品免费视频在线| 99re热这里只有精品免费视频| 国产美女扒开尿口久久久| 欧美不卡视频一区发布| 亚洲天堂男人| 在线不卡a资源高清| 欧美日韩在线一区二区三区| 久久久久国产精品www| 99re热精品| 激情五月婷婷综合| 欧美色精品在线视频| 久久免费精品日本久久中文字幕| 99这里只有久久精品视频| 国内精品视频在线播放| 欧美日韩视频在线观看一区二区三区| 午夜一区在线| 亚洲精品国精品久久99热| 国产视频精品va久久久久久| 欧美激情亚洲| 久久精品天堂| 亚洲午夜激情网站| 亚洲国产一区二区a毛片| 国产欧美大片| 欧美日韩在线不卡| 久久久综合精品| 亚洲欧美日韩精品久久奇米色影视| 亚洲第一中文字幕| 国产在线欧美日韩| 国产精品理论片| 欧美高清在线视频| 欧美一二三区精品| 99精品黄色片免费大全| 精品成人在线观看| 国产乱码精品| 欧美日韩在线一区二区三区| 乱人伦精品视频在线观看| 亚洲欧美制服中文字幕| 日韩视频二区| 亚洲国产精品黑人久久久| 国产在线视频欧美| 国产精品每日更新在线播放网址| 欧美成人国产va精品日本一级| 欧美在线一级视频| 亚洲一区二区三区视频| 亚洲精品小视频在线观看| 在线不卡a资源高清| 国产一区二区欧美| 国产农村妇女毛片精品久久麻豆| 欧美日韩亚洲一区| 欧美精品免费观看二区| 免费一级欧美在线大片| 久久亚洲私人国产精品va| 欧美在线一区二区三区| 香蕉久久一区二区不卡无毒影院| 在线亚洲免费| 日韩网站在线看片你懂的| 91久久久久久久久久久久久| 激情久久久久久| 国产视频丨精品|在线观看| 国产精品尤物| 国产精品免费看久久久香蕉| 欧美日韩亚洲一区三区 | 欧美极品在线视频| 欧美www在线| 免费美女久久99| 免费不卡在线视频| 老司机成人网| 麻豆精品一区二区综合av| 浪潮色综合久久天堂| 久久男女视频| 久久综合久久综合九色| 久久综合色8888| 噜噜噜在线观看免费视频日韩| 久久久午夜电影| 乱中年女人伦av一区二区| 欧美mv日韩mv国产网站| 欧美成人日本| 欧美日韩不卡合集视频| 欧美日韩在线观看视频|