JDK提供了ThreadLocal塔拳,用于構造線程安全的對象劲赠,ThreadLocal通過Thread的ThreadLocalMap內(nèi)部屬性來保證線程安全涛目,而ThreadLocalMap的key是ThreadLocal。通過map這種數(shù)據(jù)結構來存儲線程相關的數(shù)據(jù)经磅。而Netty里的FastThreadLocal是如何做到比ThreadLocal有更快的速度的呢泌绣。下面來分析Netty里FastThreadLocal的實現(xiàn):
-
FastThreadLocal的構造方法如下:
set方法
-
set方法的入口
-
InternalThreadLocalMap會根據(jù)線程的實現(xiàn)不同,獲取的方式不一樣:
-
InternalThreadLocalMap是一個什么樣的對象预厌,能夠比map還快速的獲取到對應的數(shù)據(jù):
-
設置數(shù)據(jù)的邏輯
總結:從上面的代碼可以看出為什么FastThreadLocal比JDK的ThreadLocal快了:FastThreadLocal通過一個index屬性(相當于FastThreadLocal的ID),直接從InternalThreadLocalMap的數(shù)組中定位到線程對應的值阿迈,而ThreadLocal設置值(或取值)需要從一個Map結構里取。Map結構也很高效轧叽,但有可能有數(shù)據(jù)沖突苗沧,并且需要計算hash值,然后定位到對象存在那里炭晒。相比數(shù)組的取值還是會低一些待逞。