JDK提供了ThreadLocal,用於構造線程安全的對象,ThreadLocal通過Thread的ThreadLocalMap內部屬性來保證線程安全,而ThreadLocalMap的key是ThreadLocal。通過map這種數據結構來存儲線程相關的數據。而Netty裏的FastThreadLocal是如何做到比ThreadLocal有更快的速度的呢。下面來分析Netty裏FastThreadLocal的實現:
- FastThreadLocal的構造方法如下:
set方法
- set方法的入口
- InternalThreadLocalMap會根據線程的實現不同,獲取的方式不一樣:
- InternalThreadLocalMap是一個什麼樣的對象,能夠比map還快速的獲取到對應的數據:
-
設置數據的邏輯
總結:從上面的代碼可以看出爲什麼FastThreadLocal比JDK的ThreadLocal快了:FastThreadLocal通過一個index屬性(相當於FastThreadLocal的ID),直接從InternalThreadLocalMap的數組中定位到線程對應的值,而ThreadLocal設置值(或取值)需要從一個Map結構裏取。Map結構也很高效,但有可能有數據衝突,並且需要計算hash值,然後定位到對象存在那裏。相比數組的取值還是會低一些。