Netty学习之旅----ThreadLocal原理分析与性能优化思考(思考篇)

JVM内存模型与上海高并发场景 内存屏障与指令重排序ThreadLocal内存泄漏Spring循环依赖破解 王文峰,优快云 2020年度博客之星,专注于Java开发,公众号“JAVA开发王大师”主理人。本文深入探讨了JVM内存模型、并发编程、Spring与Netty框架的底层原理,并结合上海高并发场景的实际案例,提供了性能优化的具体方案。文章涵盖了内存屏障、指令重排序、ThreadLocal内存泄漏、Spring循环依赖、Netty的Epoll模式等关键技术点,并分享了ZGC、Project Loom等JDK新特性在上海企业中的应用实践。通过实际案例和代码示例,为开发者提供了应对高并发场景的优化思路和解决方案。 阅读详情
  • @return the current thread’s value of this thread-local

*/

public T get() {

Thread t = Thread.currentThread(); //@1

ThreadLocalMap map = getMap(t); //@2

if (map != null) {

ThreadLocalMap.Entry e = map.getEntry(this); //@3

if (e != null)

return (T)e.value;

}

return setInitialValue(); // @4

}

代码@1:获取当前线程。

代码@2:从当前线程获取ThreadLocalMap。

ThreadLocalMap getMap(Thread t) {

return t.threadLocals;

}

这里是直接返回线程对象的threadLocals变量,有点意思吧,所以说ThreadLocal,是线程的本地变量,就是这层意思,真正存放数据的地方,就是线程对象本身,其实接下来的会更加有意思:我们进入ThreadLocalMap源码分析,得知,原来ThreadLocalMap就是一个Map结构(K-V)键值对,关于里面的源码就不一一分析了,ThreadLocalMap(ThreadLocal firstKey, Object firstValue),firstKey 为ThreadLocal,神奇吧,其实这也是为什么Thread的本地变量的数据类型为Map的原型,一个线程可以被多个ThreadLocal关联,每声明一个,就在线程的threadLocals增加为一个键值对,key 为 ThreadLocal,而value为具体存放的对象。

代码@3:如果线程的ThreadLocalMap不为空,则直接返回对,否则进入到代码@4

代码@4:初始化并获取放入ThreadLocal中的变量。

上面就是ThreadLocal的核心设计理念,为了更加直观的说明ThreadLocal原理,举例说明:


public class ThreadLocalDemo1 {

private static final ThreadLocal schemaLocal

= new ThreadLocal();

public void test1() {

String a = schemaLocal.get();

ThreadLocalDemo2 demo2 = new ThreadLocalDemo2();

demo2.test(a);

}

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

public class ThreadLocalDemo2 {

private static final ThreadLocal slocal = new ThreadLocal();

public void test(String b) {

String a = slocal.get();

// 其他代码

System.out.println(b);

}

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

public class TestMain {

public static void main(String[] args) {

// TODO Auto-generated method stub

ThreadLocalDemo1 d = new ThreadLocalDemo1();

d.test1();

}

}

一个线程调用 ThreadLocalDemo1 的 test1方法,在这个执行链中会涉及到两个ThreadLocal变量,调用ThreadLocal的get方法,首先会获取当前线程,然后从当前线程对象中获取线程内部属性[ThreadLocal.ThreadLocalMap threadLocals = null;],然后从ThreadLocalMap中以ThreadLocal对象为键,从threadLocals map中获取存放的值。

线程的threadLocals值为

{

ThreadLocalDemo1.schemaLocal  : 该变量中的值,

ThreadLocalDemo2.scloal : 存放在本线程中的值

}

3、 ThreadLocal优化思考

==================

ThreadLocal的数据访问算法,本质上就是Map的访问特性。

我在分析HashMap源码的时候,已经将HashMap的存储结构讲解完毕,如有兴趣,可以浏览一下我的博文:深入理解HashMap:http://blog.youkuaiyun.com/prestigeding/article/details/52861420,HashMap根据key的访问速度效率是很快的,为什么呢?因为HashMap根据key的hash,然后会定位到内部的数据槽(该数据是数组结构),众所周知,根据数组的下标访问,访问速度是最快的,也就是说HashMap根据key的定位速度比LinkedList等都快,仅次于数组访问方式,这是因为HashMap多了一步Hash定位槽的过程(当然,如果有Hash冲突那就更慢了)。所以,如果在高并发场景下,需要进一步优化ThreadLocal的访问性能,那就要从线程对象(Thread的threadLocals 数据结构下手了,如果能将数据结构修改为数组,然后每个ThreadLocal对象维护其下标那就完美了)。是的,Netty框架就是为了高并发而生的,由于并发访问的数量很大,一点点的性能优化,就会带来可观的性能提升效应,Netty主要从如下两个方面对ThreadLocal的实现进行优化

  • 线程对象直接提供 set、get方法,以便直接获取线程本地存储相关的变量属性。

  • 将数据存储基于数组存储。

4、Netty关于ThreadLocal机制的优化

=========================

由于ThreadLocal是JDK的原生实现,通用性很强,直接扩展进行定制化不是明智的选择,故Netty在优化ThreadLocal的方式是自己另起灶炉,实现ThreadLocal的语义。优化方法如下:

  • 提供一个接口,FastThreadLocalAccess,并对线程池工厂类进行定制,创建的线程继承在java.lang.Thread类,并实现FastThreadLocalAccess接口,提供直接设置,获取线程本地变量的方法。

  • 提供FastThreadLocal类,此类实现ThreadLocal相同的语义。

  • 提供InternalThreadLocalMap类,此类作用类同于java.lang.ThreadLocal.ThreadLocalMap类,用于线程存放真实数据的结构。

4.1 扩展线程对象,提供set,get方法


通过定制的线程池工厂,创建的线程对象为扩展后的线程对象,在Netty中对应为FastThreadLocalThread,该类本身很简单,值得大家注意的是其思想,jdk并发包中提供的线程池实现机制中,提供了线程创建的工厂的扩展点,这里就是其典型的实践。这里附上其源码,不做解读:

public class FastThreadLocalThread extends Thread implements FastThreadLocalAccess {

private InternalThreadLocalMap threadLocalMap;

public FastThreadLocalThread() { }

public FastThreadLocalThread(Runnable target) {

super(target);

}

public FastThreadLocalThread(ThreadGroup group, Runnable target) {

super(group, target);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

Netty 的 FastThreadLocal VS JAVA ThreadLocal 我们都有在源码中发现 FastThreadLocal 的身影,顾名思义,Netty 作为高性能的网络通信框架,FastThreadLocal 是比 JDK 自身的 ThreadLocal 性能更高的通信框架。FastThreadLocal 到底比 ThreadLocal 快在哪里呢? 说明:本文参考的 Netty 源码版本为 4.1.42.Final。 文章目录JDK ThreadLocal 基本原理 JDK ThreadLocal 基本原理 JDK ThreadLocal 不仅是高频的面试知识点,而 阅读详情

相关推荐

Java高频面试基础问题与知识点整理

Java高频面试知识点总结:覆盖高频基础知识考点+高频集合知识点深入分析+高频多线程与并发编程面试题汇总+其他扩展考察等。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

深入理解 Netty FastThreadLocal

本文以线上诡异问题为切入点,通过对比JDK ThreadLocal和Netty FastThreadLocal实现逻辑以及优缺点,并深入解读源码,由浅入深理解Netty FastThreadLocal。

vivo互联网技术 780

东华大学2020考研计算机OJ题目解答分享——进阶篇(4)

4 一个月的天数 作者: Turbo时间限制: 1S章节: 分支结构 问题描述 : 输入年和月,输出该月有几天。 输入说明 : 输入两个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月。 输出说明 : 输出该年该月的天数,输出时,行首与行尾均无空格,仅输出一个整数。 输入范例 : 2000 2 输出范例 : 29 解答思路: 闰年和质数出题一样频繁,简单必会 AC代码 #include...

qq_38344326的博客 473

震惊:Netty竟然对ThreadLocal做出这种事...

threadlocal

taotao12312的博客 1018

GQA数据集介绍

GQA,这是一个用于真实世界视觉推理和组合问答的新数据集。2200万个不同的推理问题,所有这些问题都带有表示其语义的功能程序。答案分布受到严格控制。11.3万张图像、2200万个问题,推理能力有对象和属性识别、传递关系跟踪、空间推理、逻辑推理和比较。

qq_56551150的博客 2956

机械臂开发必备:KDL库正逆解与动力学实战指南

在机器人算法领域,运动学与动力学计算是机械臂控制、仿真与轨迹规划的核心基础。正运动学描述关节空间到笛卡尔空间的映射,逆运动学则需要求解复杂的非线性方程,工程实现时常面临数值稳定性与调试效率的挑战。KDL(Kinematics and Dynamics Library)作为ROS生态中广泛使用的开源库,提供了统一的模型描述与高效求解器,将正逆解、雅可比矩阵及动力学参数计算封装为简洁接口,大幅降低开发门槛。无论是机械臂的笛卡尔空间轨迹跟踪,还是基于动力学模型的前馈控制,KDL都展现出强大的工程价值。本文从运动学

weixin_33860528的博客 2506

Netty源码性能分析 - ThreadLocal PK FastThreadLocal

Netty 探路

黄裳博客 824

避开RK3588开发板SDIO配置的坑:O9201SB WiFi模组接入实战指南

本文为嵌入式开发者提供了在RK3588开发板上,利用TF卡槽接入O9201SB WiFi6模组的实战指南。文章深度剖析了SDIO配置中常见的电源管理序列冲突问题,并给出了从设备树节点修改、内核编译到系统验证的完整解决方案,帮助开发者避开配置陷阱,成功实现高性能无线连接。

sprite的博客 954

一文读懂 .NET 中的 ThreadLocal 和 AsyncLocal

欢迎来到 Dotnet 工具箱!在这里,你可以发现各种令人惊喜的开源项目!本篇文章,我们主要介绍一下 C# 中关于异步操作的一个重要知识点,ThreadLocal 和 AsyncLocal。基本概念ThreadLocal 用于在多线程环境中创建线程局部变量,可以让每个线程独立地访问自己的变量副本,互不影响。而 AsyncLocal 是 ThreadLocal 的异步版本,专门用于异步编程场景,在异...

dotNET跨平台 1182

华为OD机试双机位C卷 - 高矮个子排队 (C++/Py/Java/Js/Go/C)

华为OD机试双机位C卷 高矮个子排队,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 高矮个子排队。

qq_45776114的博客 2160

手机银行应用架构设计

网上银行借助互联网、移动通信网络等技术向客户提供金融服务,易受到通讯层面的安全威胁,金融机构应从通讯协议、安全认证、通信链路安全等层面,采取措施有效应对相关风险。网上银行系统服务器端提供网上银行应用服务和核心业务处理功能,金融机构应充分利用物理环境、通信网络、计算环境等领域的防护技术,在攻击者和受保护的资源间建立多道严密的安全防线。 网上银行除直接向用户提供金融服务外,也可能与外部机构开展业务合作。在网上银行系统设计、开发、部署和运营过程中,应充分考虑外部机构的系统可能存在的安全风险,并针对各类风险进行有效

银行信息系统应用架构详解 4832

Netty学习十六:源码分析之FastThreadLocal

Netty学习系列

weixin_41402069的博客 509

36、转子 - 主动磁轴承系统建模及密封性能研究

本文研究了转子-主动磁轴承(AMBs)系统的动力学建模、稳定性分析及密封性能。通过建立包含转子、电子控制系统和接口接触的机电模型,结合Bernoulli-Euler梁理论与弹簧单元等效法,构建了考虑接口接触的闭环系统模型,并在磁悬浮鼓风机和电机上进行数值模拟与实验验证,结果表明接口接触刚度显著影响系统稳定性,尤其在高预紧扭矩下易激发弯曲模态失稳。同时,对非接触式低温密封进行了CFD仿真与实验测试,发现浮动环密封(FRS)具有最优的泄漏控制和抗磨损性能。研究成果为提升高速旋转机械的稳定性和密封可靠性提供了理论

vim8coder的博客 135

netty-FastThreadLocal用法测试

2017年写Netty相关文章的时候,关于Netty中FastThreadLocal.java源码解读的文章还很少。今天(2019-02-25)回头过来整理的时候,发现网上已经涌现出了许多篇介绍FastThreadLocal.java的文章,并且,已经有解读的比较详实的文章,所以本人已经不打算进一步分析源码了。此处暂且列出几篇优秀的博文供大家查阅。 1. Netty精粹之设计更快的ThreadL...

lhever_的博客 595

5步上手Quartz.NetUI:.NET Core定时任务的开箱即用解决方案

Quartz.NetUI是一个基于.NET Core + Quartz.NET + Vue + IView的开箱即用的定时任务UI解决方案。它结合了Quartz.NET的强大功能和Vue.js的易用性,提供了一个不依赖数据库、只需在界面进行简单配置即可使用的定时任务管理系统。通过上述步骤,你已经学会了如何使用Quartz.NetUI在.NET Core项目中实现定时任务。Quartz.NetUI不仅功能强大,而且使用简单,非常适合那些需要快速实现定时任务管理的开发者。

java专栏 2408

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

吊打 ThreadLocal,谈谈FastThreadLocal为啥能这么快?

前文说过,ftl要结合ftlt才能最大地发挥其性能,如果是其他的普通线程,就会退化到jdk的ThreadLocal的情况,因为普通线程没有包含InternalThreadLocalMap这样的数据结构,接下来我们看如何退化。注意,这里保存的直接是变量值,不是entry,这是和jdk ThreadLocal不同的。该Map是使用线性探测的方式解决hash冲突的问题,如果没有找到空闲的slot,就不断往后尝试,直到找到一个空闲的位置,插入entry,这种方式在经常遇到hash冲突时,影响效率。

weixin_44421461的博客 62

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

从零手写分布式任务调度与Netty网络框架:深度解析核心原理与实战

分布式任务调度是构建高可用、可扩展后端系统的关键技术,其核心在于协调多个节点有序、可靠地执行定时或异步任务。其实现原理通常围绕任务编排、状态管理、故障转移与负载均衡展开。在Java生态中,XXL-JOB作为广泛应用的调度框架,其设计体现了这些核心思想。而高性能的网络通信则是分布式系统交互的基石,Netty通过其Reactor线程模型和高效的ByteBuf内存管理,为高并发场景提供了底层支撑。理解这两者的底层实现,对于深入掌握分布式系统架构、优化应用性能具有重要价值。本文聚焦于一个教学级的开源项目,它通过从零

weixin_33910137的博客 873

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【战、面试官】小伙子告诉我,为什么说FastThreadLocal是装上火箭的ThreadLocal?

最近比较低沉且颓废,但是还是要振作起来。fighting,本期给大家带来的是netty源码中对ThreadLocal的改造->FastThreadLocal。

m0_55861832的博客 197

图文分析FastThreadLocal快在哪里?

Java面试笔试面经、Java技术每天学习一点公众号Java面试关注我不迷路作者:Joel.Wang老王来源:https://blog.youkuaiyun.com/mycs2012/1 FastTh...

java面试笔试 299

2026秋招Java后端面试核心考点:JVM、Spring、MySQL、Redis与Netty全梳理

在Java后端开发中,理解JVM、Spring、MySQL与Redis等核心技术的底层原理,是应对大厂面试与实践优化的关键。例如,JVM的运行时数据区、对象分配与GC机制,决定了线上OOM的排查方向;JIT编译参数如-XX:CompileThreshold影响热点代码执行效率。Spring的IoC容器与三级缓存设计,解决了循环依赖与AOP代理的复杂场景。MySQL的B+树索引与事务隔离级别,是慢查询优化与数据一致性的基础;而Redis作为高并发缓存组件,其分布式锁实现、缓存穿透/击穿/雪崩的解决方案,更是面

weixin_30954265的博客 396

JDK 21虚拟线程在Spring Boot中的性能优化实践

虚拟线程是JDK 21引入的轻量级线程模型,通过用户态调度和协作式任务切换,大幅提升Java应用的并发处理能力。相比传统操作系统线程,虚拟线程创建成本低且不受内核限制,特别适合高并发IO密集型场景。在Spring Boot应用中,只需简单配置即可启用虚拟线程,Tomcat等Web容器能轻松支持数万并发连接。通过电商系统实测,相同硬件下QPS提升近3倍,响应时间降低67%。该技术显著降低了异步编程复杂度,同时保持同步代码的调试便利性,是替代CompletableFuture和Reactive编程的高效方案。

weixin_34116110的博客 394

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1万+
上一篇: Netty之JavaNIO编程模型介绍01,java面试基本知识
下一篇: MobileNetV1实战:使用MobileNetV1实现植物幼苗分类(1)
普通网友
博客等级 码龄5年 4697粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值