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

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

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

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

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

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

1.先從ThreadLocal說起

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

ThreadLocal 底層是使用 ThreadLocalMap 實現(xiàn)的,這點從 JDK 的源碼中可以看出,核心源碼如下:cpy28資訊網(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 是存儲在 ThreadLocalMap 中的,咱們繼續(xù)看 ThreadLocalMap 的源碼實現(xiàn):cpy28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

2.ThreadLocal存在的問題

(1)性能問題

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

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

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

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

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

3.FastThreadLocal特點

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

(1)效率高

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

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

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

public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap {    // 自增索引, ?于計算下次存儲到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ù)組索引 index,index 的值采用原子類 AtomicInteger 保證順序遞增,通過調(diào)用 InternalThreadLocalMap.nextVariableIndex() 方法獲得。然后在讀寫數(shù)據(jù)的時候通過數(shù)組下標 index 直接定位到 FastThreadLocal 的位置,時間復(fù)雜度為 O(1)。如果數(shù)組下標遞增到非常大,那么數(shù)組也會比較大,所以 FastThreadLocal 是通過空間換時間的思想提升讀寫性能。cpy28資訊網(wǎng)——每日最新資訊28at.com

因此,在 FastThreadLocal 中并不需要使用線性探測法來解決 Hash 沖突,因為它是使用數(shù)組進行存儲的,每次使用下標進行查詢即可,它的查詢時間復(fù)雜度也是 O(1) 的,所以它的操作效率很高。cpy28資訊網(wǎng)——每日最新資訊28at.com

(2)安全性更高

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

FastThreadLocalRunnable 自動清除對象的實現(xiàn)核心源碼如下:cpy28資訊網(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 存在以下兩個主要優(yōu)點:cpy28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風(fēng)暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學(xué)弟,最近學(xué)習(xí)的怎么樣啊 了不起學(xué)弟:最近學(xué)習(xí)的還不錯,每天都在學(xué)習(xí),每天都在進步! 了不起:那你最近學(xué)習(xí)的什么呢? 了不起學(xué)弟:最近在學(xué)習(xí)C
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級

    來源 | 伯虎財經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內(nèi)容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業(yè)內(nèi)一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 國行版三星Galaxy Z Fold5/Z Flip5發(fā)布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發(fā)布會,正式在國內(nèi)推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • iQOO 11S新品發(fā)布會

    iQOO將在7月4日19:00舉行新品發(fā)布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發(fā)布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風(fēng)扇版本

    據(jù)10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風(fēng)扇版本。另外,這款顯卡 PCB
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內(nèi)容審核等。此前,T
Top 主站蜘蛛池模板: 运城市| 德令哈市| 游戏| 双柏县| 图们市| 泸水县| 贡山| 准格尔旗| 拉萨市| 辽宁省| 汉川市| 建宁县| 孟村| 平远县| 吉木萨尔县| 开原市| 上林县| 定日县| 达拉特旗| 朝阳市| 瓦房店市| 泉州市| 南汇区| 常熟市| 盐山县| 夏河县| 龙里县| 孟连| 年辖:市辖区| 庄河市| 东乡族自治县| 嘉峪关市| 石渠县| 崇明县| 富源县| 平邑县| 盐山县| 永春县| 澄迈县| 乌兰县| 怀来县|