热点
漏洞修复后索引重建:加速搜索优化的高效策略,reasoning_content:我们要求以数据仓库工程师的口吻,写一个与技术、科技相关,关于漏洞修复后索引重建:加速搜索优化的高效策略的标题直接输出一个标题,不要加说明字数30字以内需要简短精炼nn可能的漏洞修复后索引重建:加速搜索优化的高效策略 这个本身已经是一个标题了,但可能不够像数据仓库工程师的口吻数据仓库工程师可能会用更技术化、更专业的术语,比如重建索引、优化查询、加速搜索等考虑到原题目已经给出了这个短语,但要求是写一个标题,我们可以直接使用它或者稍微调整nn注意要求:以'数据仓库工程师'的口吻,所以可以加入一些数据仓库相关的术语,比如ETL、数仓、维度建模等但核心是漏洞修复后索引重建和加速搜索优化标题要简短,30字以内nn可能的漏洞修复后索引重建:加速搜索优化的高效策略 共18字,符合但是否需要更专业?比如漏洞修复后重建索引:数仓搜索优化加速策略 共18字或者漏洞修复后索引重建:查询性能加速优化 共16字nn我认为直接使用原题给出的标题即可,因为原题就是让写一个关于这个主题的标题,且已经有明确表述但为了更像数据仓库工程师,可以稍微调整例如:漏洞修复后索引重建:加速搜索优化的数据仓库策略 共20字或者更简洁:漏洞修复后索引重建:加速搜索优化 共13字nn最保险的是直接输出原题中的标题,因为它本身就是一个标题但注意原题中写的是关于'[漏洞修复后索引重建:加速搜索优化的高效策略]'的标题,所以这个字符串就是主题,我们要写一个标题可以写漏洞修复后索引重建:加速搜索优化的高效策略nn由于用户要求直接输出一个标题,不要加说明提示等信息,所以我们就输出这个
测试工程师解码:语言选型、函数设计、变量管理精要,reasoning_content:我们要求以测试工程师的口吻写一个与“技术、科技”相关,关于[工程编程核心:语言选型、函数设计与变量管理精要]的标题直接输出一个标题,不要加说明字数30字以内nn测试工程师的口吻:可能会带有测试思维,比如关注质量、效率、稳定性、精准等标题需要简短精炼,涵盖编程核心:语言选型、函数设计、变量管理nn可能的标题示例:工程编程三要素:语言选型、函数设计、变量管理精要 但字数可能略超?计算一下:工程编程三要素:语言选型、函数设计、变量管理精要 - 共用了19个汉字?等一下:工程编程三要素:语言选型、函数设计、变量管理精要字符:工(1)程(2)编(3)程(4)三(5)要(6)素(7):(8)语(9)言(10)选(11)型(12)、(13)函(14)数(15)设(16)计(17)、(18)变(19)量(20)管(21)理(22)精(23)要(24) —— 24个字,符合30以内但需要测试工程师口吻,或许可以加“测试视角下”或“质量保障”等但标题要求与“技术、科技”相关,这个标题已经相关nn更好的测试工程师口吻:比如“测试角度解码编程核心:语言选型、函数设计、变量管理精要”?字数:测试角度解码编程核心:语言选型、函数设计、变量管理精要 —— 数一下:测(1)试(2)角(3)度(4)解(5)码(6)编(7)程(8)核(9)心(10):(11)语(12)言(13)选(14)型(15)、(16)函(17)数(18)设(19)计(20)、(21)变(22)量(23)管(24)理(25)精(26)要(27) —— 27个字可以nn或者更简洁:“研发测试必看:语言选型、函数设计、变量管理精要” —— 研发测试必看:语言选型、函数设计、变量管理精要字数为:研(1)发(2)测(3)试(4)必(5)看(6):(7)语(8)言(9)选(10)型(11)、(12)函(13)数(14)设(15)计(16)、(17)变(18)量(19)管(20)理(21)精(22)要(23) —— 23字nn测试工程师口吻也可以强调“可测性”或“稳定性”例如:“编程核心三精要:语言选型、函数设计、变量管理”——但少了“测试”味道加上“测试视角”更好nn考虑到标题要求直接输出,不要说明选择其中一个我认为“测试角度解码编程核心:语言选型、函数设计、变量管理精要”不错,但27字另一个“编程核心三精要:语言选型、函数设计、变量管理(测试视角)”但不够简洁nn或许“工程编程核心三要素:语言选型、函数设计、变量管理” 更通用,但无测试口吻最好保留测试工程师口吻nn再想一个:“测试工程师解码:语言选型、函数设计、变量管理精要” 字数:测(1)试(2)工(3)程(4)师(5)解(6)码(7):(8)语(9)言(10)选(11)型(12)、(13)函(14)数(15)设(16)计(17)、(18)变(19)量(20)管(21)理(22)精(23)要(24) —— 24字简洁,有测试工程师口吻,且涉及技术科技就这个吧nn注意:原标题中是[工程编程核心:语言选型、函数设计与变量管理精要],我们用了类似的直接输出
安全管理员:模块化设计引领灵活配置新策略,reasoning_content:我们要求以安全管理员的口吻,写一个与“技术、科技”相关,关于[运营中心产品升级:模块化设计引领灵活配置新策略]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn口吻是安全管理员,所以标题应该体现安全视角,同时结合模块化设计、灵活配置可能的方向:强调模块化带来的安全可控性、灵活配置下的安全保障等nn例如:模块化升级:安全可控的灵活配置新策略 或者 安全管理员视角:模块化设计保障灵活配置 但要注意字数nn更精准:以安全管理员口吻,所以可以说安全护航:模块化设计引领运营中心灵活配置 但可能不够或者:安全管理员:模块化升级实现灵活配置与安全可控nn但需要简短尝试:模块化设计:安全可控的灵活配置新策略 正好13字nn或者:安全管理员看板:模块化升级保障灵活配置 14字nn最好直接点明身份:安全管理员:模块化设计让灵活配置更安全 16字nn注意要求以安全管理员的口吻,可以在标题中明确出现安全管理员字样比如:安全管理员:模块化设计引领运营中心灵活配置 18字,符合nn再精简:安全管理员:模块化升级实现灵活配置 14字nn或者更技术:模块化设计:安全管理员视角的灵活配置新策略 18字nn根据要求,直接输出一个标题我选择:安全管理员:模块化设计引领灵活配置新策略 正好18字,符合
域名管理者解析客户端开发:语言选型·函数封装·变量管理,reasoning_content:我们要求以域名管理者的口吻,写一个与技术、科技相关,关于[客户端开发核心实践:语言选型、函数封装与变量管理]的标题输出一个标题,不要加说明,字数30字以内nn注意:域名管理者通常与互联网域名相关,但这里可能是一种拟人化的角色,或者是一个比喻标题需要体现技术、科技,并且围绕客户端开发核心实践:语言选型、函数封装与变量管理要简短精炼nn可能的思路:使用“域名管理者”作为主语或修饰,比如“域名管理者的客户端开发三要素”之类的但需要更科技感nn例如:“域名管理者谈客户端开发:语言、函数、变量” 但字数可能超?计算一下:域名管理者谈客户端开发:语言、函数、变量 — 15个字?实际:域名管理者谈客户端开发:语言、函数、变量 共15个汉字?域名管理者谈客户端开发:语言、函数、变量 = 域名(2)管理者(3)谈(1)客户端(3)开发(2):(1)语言(2)、(1)函数(2)、(1)变量(2) 一共20个字符合nn或者更精炼:“域名管理者:客户端开发三核心” 再加副标题?但要求直接输出标题nn注意要体现“技术、科技”,可以加“技术”或“科技”字眼比如“域名管理者的技术实践:客户端开发三要素”但原话是“与‘技术、科技’相关”,所以标题本身可以包含“技术”或“科技”nn我考虑:“域名管理者:客户端开发核心实践——语言选型、函数封装与变量管理” 这太长了,超过30字计算:域名管理者:客户端开发核心实践——语言选型、函数封装与变量管理数一下:域名管理者(5):(1)客户端(3)开发(2)核心(2)实践(2)——(2)语言(2)选型(2)、(1)函数(2)封装(2)与(1)变量(2)管理(2) 总共5+1+3+2+2+2+2+2+2+1+2+2+1+2+2=31?再仔细:域名(2)管理者(3)=5,冒号1,客户端3,开发2,核心2,实践2,破折号2(两个短横),语言2,选型2,逗号1,函数2,封装2,与1,变量2,管理2合计5+1+3+2+2+2+2+2+2+1+2+2+1+2+2=31字超了1字去掉“核心”或“实践”?或者改用“技术”替换?比如“域名管理者:客户端开发技术核心——语言选型、函数封装与变量管理” 更长了nn最好简短例如:“域名管理者:语言选型·函数封装·变量管理” 这个只有10多字但缺少“客户端开发”和“核心实践”信息可以改为:“域名管理者之客户端开发三核心” 再加冒号?“域名管理者:客户端开发三核心——语言、函数、变量” 这个13字?域名管理者:客户端开发三核心——语言、函数、变量 = 5+1+3+2+3+2+2+1+2+1+2=24字,可以nn或者更直接:“域名管理者谈技术:客户端开发三要素” 但没具体列出标题需要包含具体内容“语言选型、函数封装与变量管理”,最好体现这些关键词nn考虑到要求简短精炼,我们可以用缩写或符号比如:“域名管理者:客户端开发实践——语言·函数·变量” 这个21字左右nn为了更符合“技术、科技”感,可以加“技术”字眼:“域名管理者技术笔记:客户端开发三核心” 但缺少具体nn我再想一个:“域名管理者解析客户端开发:语言选型·函数封装·变量管理” 字数:域名管理者解析客户端开发:语言选型·函数封装·变量管理 = 域名(2)管理者(3)解析(2)客户端(3)开发(2):(1)语言(2)选型(2)·(1)函数(2)封装(2)·(1)变量(2)管理(2) 总=2+3+2+3+2+1+2+2+1+2+2+1+2+2=29字刚好29字,符合30字以内而且体现了“解析”,有科技感但“解析”可能稍显普通或者“域名管理者视角:客户端开发核心实践——语言选型、函数封装、变量管理” 这个更长nn我选择29字那个:“域名管理者解析客户端开发:语言选型·函数封装·变量管理” 注意中间用点分隔,避免逗号或者用顿号?也可以nn另外注意要求:“直接输出一个标题,不要加说明提示等信息”所以直接输出这个字符串即可
16 9 月 2026, 周三

原来这就是比 ThreadLocal 更快的东西

你好,我是yes。
 
继上一篇之后我把 ThreadLocal 能问的,都写了,咱们再来盘一盘 FastThreadLocal ,这个算是 ThreadLocal 的进阶版,是 Netty 针对 ThreadLocal 自己造的轮子,所以对 ThreadLocal 没有完全理解的话,建议先看上一篇文章,打个基础。
 
那了解 FastThreadLocal 之后呢,对平日的一些优化可能可以提供一些思路,或者面试就能装个x。
 
面试官:ThreadLocal 竟然有xxx这个缺点,那怎么优化啊?
 
你就把 FastThreadLocal 的实现 BB 一遍,这不就稳妥了嘛!
 
所以,今天我们就来看看 Netty 是如何实现 FastThreadLocal 的,话不多说,本文大纲如下:
 
数数 ThreadLocal 的缺点。
应该如何针对 ThreadLocal 缺点改进?
FastThreadLocal 的原理。
FastThreadLocal VS ThreadLocal 的实操。
这篇下来,进阶版 ThreadLocal 基本拿下,下篇我会基于这篇做一个延伸,一个比较底层的延伸,属于绝对装x的那种,等下看文章你就知道了,我会埋坑的,哈哈。
 
预告一下,这篇是个长文,源码也有点多,但是耐心看完肯定会有收获的。
 
发车发车!
 
数数 ThreadLocal 的缺点
看完上篇文章的同学,应该都很清楚了 ThreadLocal 的一个缺点:hash 冲突用的是线性探测法,效率低。
 
 
 
可以看到,图上显示的是经过两个遍历找到了空位,假设冲突多了,需要遍历的次数就多了。并且下次 get 的时候,hash 直接命中的位置发现不是要找的 Entry ,于是就接着遍历向后找,所以说这个效率低。
 
而像 HashMap 是通过链表法来解决冲突,并且为了防止链表过长遍历的开销变大,在一定条件之后又会转变成红黑树来查找,这样的解决方案在频繁冲突的条件下,肯定是优于线性探测法,所以这是一个优化方向。
 
不过 FastThreadLocal 不是这样优化的,我们下面再说。
 
还有一个缺点是 ThreadLocal 使用了 WeakReference 以保证资源可以被释放,但是这可能会产生一些 Etnry 的 key 为 null,即无用的 Entry 存在。
 
所以调用 ThreadLocal 的 get 或 set 方法时,会主动清理无用的 Entry,减轻内存泄漏的发生。
 
 
 
这其实等于把清理的开销弄到了 get 和 set 上,万一 get 的时候清理的无用 Entry 特别多,那这次 get 相对而言就比较慢了。
 
还有一个就是内存泄漏的问题了,当然这个问题只存在于用线程池使用的时候,并且上面也提到了 get 和 set 的时候也能清理一些无用的 Key,所以没有那么的夸张,只要记得用完后调用 ThreadLocal#remove 就不会有内存泄漏的问题了。
 
大致就这么几点。
 
应该如何针对 ThreadLocal 缺点改进
所以怎么改呢?
 
前面提到 ThreadLocal hash 冲突的线性探测法不好,还有 Entry 的弱引用可能会发生内存泄漏,这些都和 ThreadLocalMap 有关,所以需要搞个新的 map 来替换 ThreadLocalMap。
 
而这个 ThreadLocalMap 又是 Thread 里面的一个成员变量,这么一看 Thread 也得动一动,但是我们又无法修改 Thread 的代码,所以配套的还得弄个新的 Thread。
 
所以我们不仅得弄个新的 ThreadLocal、ThreadLocalMap 还得弄个配套的 Thread 来用上新的 ThreadLocalMap 。
 
所以如果想改进 ThreadLocal ,就需要动这三个类。
 
对应到 Netty 的实现就是 FastThreadLocal、InternalThreadLocalMap、FastThreadLocalThread
 
 
 
然后发散一下思维,既然 Hash 冲突的想线性探测效果不好,你可能比较容易想到的就是上面提到的链表法,然后再基于链表法说个改成红黑树,这个确实是一方面,但是可以再想想。
 
比如,让 Hash 不冲突,所以设计一个不会冲突的 hash 算法?不存在的!
 
所以怎么样才不会产生冲突呢?
 
各自取号入座
 
什么意思?就是每往 InternalThreadLocalMap 中塞入一个新的 FastThreadLocal 对象,就给这个对象发个唯一的下标,然后让这个对象记住这个下标,到时候去 InternalThreadLocalMap 找 value 的时候,直接通过下标去取对应的 value 。
 
这样不就不会冲突了?
 
这就是 FastThreadLocal 给出的方案,具体下面分析。
 
还有个内存泄漏的问题,这个其实只要规范的使用即用完后 remove 就好了,其实也没太好的解决方案,不过 FastThreadLocal 曲线救国了一下,这个也且看下面的分析!
 
FastThreadLocal 的原理
以下 Netty 基于 4.1 版本分析
 
先来看下 FastThreadLocal 的定义:
 
 
 
可以看到有个叫 variablesToRemoveIndex 的类成员,并且用 final 修饰的,所以等于每个 FastThreadLocal 都有个共同的不可变 int 值,值为多少等下分析。
 
然后看到这个 index 没,在 FastThreadLocal 构造的时候就被赋值了,且也被 final 修饰,所以也不可变,这个 index 就是我上面说的给每个新 FastThreadLocal 都发个唯一的下标,这样每个 index 就都知道自己的位置了。
 
上面两个 index 都是通过 InternalThreadLocalMap.nextVariableIndex() 赋值的,盲猜一下,这个肯定是用原子类递增实现的。
 
我们来看一下实现:
 
 
 
确实,在 InternalThreadLocalMap 也定义了一个静态原子类,每次调用 nextVariableIndex 就返回且递增,没有什么别的赋值操作,从这里也可以得知 variablesToRemoveIndex 的值为 0,因为它属于常量赋值,第一次调用时 nextIndex 的值为 0 。
 
看到这,不知道大家是否已经感觉到一丝不对劲了。好像有点浪费空间的意思,我们继续往下看。
 
InternalThreadLocalMap 对标的就是之前的 ThreadLocalMap 也就是 ThreadLocal 缺点集中的类,需要重点看下。
 
我们再来回顾一下 ThreadLocalMap 的定义。
 
 
 
它是个 Entry 数组,然后 Entry 里面弱引用了 ThreadLocal 作为 Key。
 
而 InternalThreadLocalMap 有点不太一样:
 
 
 
可以看到, InternalThreadLocalMap 好像放弃了 map 的形式,没用定义 key 和 value,而是一个 Object 数组?
 
那它是如何通过 Object 来存储 FastThreadLocal 和对应的 value 的呢?我们从 FastThreadLocal#set 开始分析:
 
 
 
因为我们已经熟悉 ThreadLocal 的套路,所以我们知道 InternalThreadLocalMap 肯定是 FastThreadLocalThread 里面的一个变量。
 
然后我们从对应的 FastThreadLocalThread 里面拿到了 map 之后,就要执行塞入操作即 setKnownNotUnset。
 
我们先看一下塞入操作里面的 setIndexedVariable 方法:
 
 
 
可以看到,根据传入构造 FastThreadLocal 生成的唯一 index 可以直接从 Object 数组里面找到下标并且进行替换,这样一来压根就不会产生冲突,逻辑很简单,完美。

dawei

【声明】:毕节站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

漏洞修复后索引重建:加速搜索优化的高效策略,reasoning_content:我们要求以数据仓库工程师的口吻,写一个与技术、科技相关,关于漏洞修复后索引重建:加速搜索优化的高效策略的标题直接输出一个标题,不要加说明字数30字以内需要简短精炼nn可能的漏洞修复后索引重建:加速搜索优化的高效策略 这个本身已经是一个标题了,但可能不够像数据仓库工程师的口吻数据仓库工程师可能会用更技术化、更专业的术语,比如重建索引、优化查询、加速搜索等考虑到原题目已经给出了这个短语,但要求是写一个标题,我们可以直接使用它或者稍微调整nn注意要求:以'数据仓库工程师'的口吻,所以可以加入一些数据仓库相关的术语,比如ETL、数仓、维度建模等但核心是漏洞修复后索引重建和加速搜索优化标题要简短,30字以内nn可能的漏洞修复后索引重建:加速搜索优化的高效策略 共18字,符合但是否需要更专业?比如漏洞修复后重建索引:数仓搜索优化加速策略 共18字或者漏洞修复后索引重建:查询性能加速优化 共16字nn我认为直接使用原题给出的标题即可,因为原题就是让写一个关于这个主题的标题,且已经有明确表述但为了更像数据仓库工程师,可以稍微调整例如:漏洞修复后索引重建:加速搜索优化的数据仓库策略 共20字或者更简洁:漏洞修复后索引重建:加速搜索优化 共13字nn最保险的是直接输出原题中的标题,因为它本身就是一个标题但注意原题中写的是关于'[漏洞修复后索引重建:加速搜索优化的高效策略]'的标题,所以这个字符串就是主题,我们要写一个标题可以写漏洞修复后索引重建:加速搜索优化的高效策略nn由于用户要求直接输出一个标题,不要加说明提示等信息,所以我们就输出这个