支持JDK19虚拟线程的web框架之:兴风作浪的ThreadLocal
支持JDK19虛擬線程的web框架之
:興風作浪的ThreadLocal
關于ThreadLocal
- 既然提到了線程,自然繞不開ThreadLocal類 ,它提供了線程本地變量 ,此變量和一般的變量不同。通過get & set 方法,每個線程可以獲取到自己獨立的變量 。這個變量實例通常是私有且靜態(tài)的 ,可以存儲與線程相關的信息,如產(chǎn)品id、事務id等 。
- 下圖很形象的展現(xiàn)了ThreadLocal:是完全屬于每個線程自己的集合

虛擬線程中,ThreadLocal的問題
- 既然每個線程都可以擁有屬于自己的ThreadLocal對象 ,那虛擬線程的情況又如何呢?
- 虛擬線程的特性,使得我們可以在應用代碼中創(chuàng)建成千上萬個虛擬線程去執(zhí)行并發(fā)任務,而無需擔心線程數(shù)量對整體計算資源的負擔,如果每個線程都用了ThreadLocal,那會不會出現(xiàn)成千上萬的ThreadLocal對象呢?線程是虛擬的,對象可是實實在在的 ,這樣會增加系統(tǒng)資源消耗 ,或者影響性能嗎?
- 不過轉(zhuǎn)念一想 ,這么明顯的問題,連我都能想到 ,JDK組織又豈會漏掉?應該是我多慮了吧 ,憑自己"豐富的經(jīng)驗",我預測解決方案應該和TLAB(Thread Local Allocation Buffer)類似,為海量虛擬線程的ThreadLoacal對象建立映射關系,做到高效管理
- 然而現(xiàn)實很殘酷,臉 ,被狠狠地抽打 ,通過Oracle官方博客,知道實際情況真慘...