TogetherOS / cicada

🚀 Fast lightweight HTTP service framework.
https://crossoverjie.top/categories/cicada/
Apache License 2.0
953 stars 212 forks source link

修改ThreadLocal #35

Closed shiwenjie12 closed 5 years ago

crossoverJie commented 5 years ago

@shiwenjie12

能谈谈为什么要用 FastThreadLocal 嘛?以及它相比 ThreadLocal 的优势。

shiwenjie12 commented 5 years ago

他主要解决了jdk的 ThreadLocal内存泄露的问题,同时使用数组替代hashmap解决数据缓存的问题,详情请看这个分析 https://www.jianshu.com/p/3fc2fbac4bb7

crossoverJie commented 5 years ago

@shiwenjie12

说实话我之前就怕你直接扔一个链接给我,文章是你写的都没问题。

希望看到的是自己对它的理解,比如你贴上代码指出哪里的可能会存在泄露,FastThreadLocal 又是怎么解决了这个问题。

这样对你自己理解也有好处,而不是看到其他人说 FastThreadLocalThreadLocal 更好就用它。

能用自己的语言解释一遍会更好。

shiwenjie12 commented 5 years ago

抱歉啊,我之前没有解释清楚,我现在说下我的一点理解 原生的ThreadLocal在内部维护了一套ThreadLocalMap进行存储,而它的键是使用了弱引用,当它的键被回收的时候,那他的value也就无法被访问到了,从而导致内存泄漏问题,这个问题在很多框架中都被重写,包括netty、Lucene, 另一方面,关于ThreadLocal的获取value需要依赖于key的不断hash获取slot,而FastThreadLocal在初始化变量的时候,利用AtomicInteger计算出了一个全局变量的slot,从而直接获取table数组中的value,从而实现更快速的获取线程缓存的获取