Netty中FastThreadLocal解读

Python爬虫:抓取餐饮平台顾客评分与评价的完整教程 本文介绍了如何使用Python爬虫技术抓取餐饮平台上的餐厅评分和评论数据。我们通过三种主要的抓取方法:静态网页抓取(requests)、动态网页抓取(Selenium)和API抓取,展示了如何抓取餐饮平台的数据。还介绍了如何使用pandas对抓取的数据进行存储、清洗、分析,并进行可视化和情感分析。通过本文的学习,您应该能够掌握如何使用Python爬虫抓取餐饮平台的评论数据,并将这些数据应用于市场分析、顾客反馈和服务优化等领域。 阅读详情

io.netty.util.concurrent.FastThreadLocal 是 Netty 中提供的高性能线程局部存储(Thread-Local Storage)实现,位于 io.netty.util.concurrent 包。它是 Java 标准库 ThreadLocal 的替代品,旨在优化性能,减少内存分配和访问开销,特别适合 Netty 的高并发异步框架。FastThreadLocal 依赖 io.netty.util.internal.InternalThreadLocalMap 实现高效存储,广泛用于 EventLoop、对象池(如 Recycler)、和性能敏感场景。


1. 源码分析

FastThreadLocal 使用 InternalThreadLocalMap (请见https://blog.youkuaiyun.com/eclipseC/article/details/149756328?spm=1001.2014.3001.5501)的 indexedVariables 数组存储线程局部变量,通过全局唯一的索引(由 InternalThreadLocalMap.nextVariableIndex() 分配)访问。

源码注释:

/**
 * FastThreadLocal 是 Netty 的高性能线程局部存储实现,优于 Java 的 ThreadLocal。
 * 通过 InternalThreadLocalMap 的索引数组存储变量,减少哈希表开销。
 * 每个 FastThreadLocal 实例分配一个唯一索引,用于访问线程局部变量。
 * @param <V> 线程局部变量的类型
 */
public class FastThreadLocal<V> {
    /**
     * 分配唯一的索引,用于在 InternalThreadLocalMap 中存储变量。
     */
    private final int index = InternalThreadLocalMap.nextVariableIndex();

    /**
     * 获取当前线程的线程局部变量值。
     * @return 变量值,如果未设置则调用 initialize 初始化
     */
    public final V get() {
        return get(InternalThreadLocalMap.get()); // 获取当前线程的 map
    }

    /**
     * 从指定的 InternalThreadLocalMap 获取变量值。
     * @param threadLocalMap 当前线程的 InternalThreadLocalMap
     * @return 变量值,如果未设置则初始化
     */
    @SuppressWarnings("unchecked")
    public final V get(InternalThreadLocalMap threadLocalMap) {
        Object v = threadLocalMap.indexedVariable(index); // 获取索引处的值
        if (v != InternalThreadLocalMap.UNSET) { // 如果不是 UNSET,直接返回
            return (V) v;
        }
        return initialize(threadLocalMap); // 初始化并返回
    }

    /**
     * 设置当前线程的线程局部变量值。
     * @param value 要设置的值
     */
    public final void set(V value) {
        if (value != InternalThreadLocalMap.UNSET) { // 避免设置 UNSET
            set(InternalThreadLocalMap.get(), value);
        } else {
            remove(); // 设置 UNSET 等同于移除
        }
    }

    /**
     * 在指定的 InternalThreadLocalMap 中设置变量值。
     * @param threadLocalMap 当前线程的 InternalThreadLocalMap
     * @param value 要设置的值
     */
    public final void set(InternalThreadLocalMap threadLocalMap, V value) {
        if (value != InternalThreadLocalMap.UNSET) {
            if (threadLocalMap.setIndexedVariable(index, value)) { // 设置值
                addToVariablesToRemove(threadLocalMap, this); // 加入清理列表
            }
        } else {
            remove(threadLocalMap); // 移除变量
        }
    }

    /**
     * 移除当前线程的线程局部变量。
     */
    public final void remove() {
        remove(InternalThreadLocalMap.get());
    }

    /**
     * 在指定的 InternalThreadLocalMap 中移除变量。
     * @param threadLocalMap 当前线程的 InternalThreadLocalMap
     */
    @SuppressWarnings("unchecked")
    public final void remove(InternalThreadLocalMap threadLocalMap) {
        Object v = threadLocalMap.indexedVariable(index);
        if (v != InternalThreadLocalMap.UNSET) { // 如果变量存在
            threadLocalMap.setIndexedVariable(index, InternalThreadLocalMap.UNSET); // 设置为 UNSET
            removeFromVariablesToRemove(threadLocalMap, this); // 从清理列表移除
            try {
                onRemoval((V) v); // 调用清理回调
            } catch (Exception e) {
                PlatformDependent.throwException(e);
            }
        }
    }

    /**
     * 初始化线程局部变量值。
     * @param threadLocalMap 当前线程的 InternalThreadLocalMap
     * @return 初始值
     */
    protected V initialize(InternalThreadLocalMap threadLocalMap) {
        V v = null;
        try {
            v = initialValue(); // 调用子类的初始值方法
        } catch (Exception e) {
            PlatformDependent.throwException(e);
        }
        threadLocalMap.setIndexedVariable(index, v); // 设置初始值
        addToVariablesToRemove(threadLocalMap, this); // 加入清理列表
        return v;
    }

    /**
     * 提供默认的初始值,子类可重写。
     * @return 默认返回 null
     * @throws Exception 如果初始化失败
     */
    protected V initialValue() throws Exception {
        return null;
    }

    /**
     * 当变量被移除时调用,子类可重写以实现清理逻辑。
     * @param value 被移除的变量值
     * @throws Exception 如果清理失败
     */
    protected void onRemoval(@SuppressWarnings("UnusedParameters") V value) throws Exception {
    }
}

2. 作用与功能

FastThreadLocal 是 Netty 优化的线程局部存储实现,其主要作用包括:

  1. 高性能存储:

    • 使用 InternalThreadLocalMap 的 indexedVariables 数组,通过整数索引访问变量,相比 Java ThreadLocal 的 HashMap 实现,减少了哈希计算和冲突处理开销。
    • 每个 FastThreadLocal 实例分配一个唯一索引(index),通过 InternalThreadLocalMap.nextVariableIndex() 生成。
  2. 线程隔离:

    • 确保每个线程的变量独立存储,适合 Netty 的单线程 EventLoop 模型。
    • 配合 FastThreadLocalThread 进一步优化性能,减少 ThreadLocal 的访问开销。
  3. 支持清理机制:

    • 提供 remove 方法和 onRemoval 回调,允许清理线程局部变量,防止内存泄漏。
    • 维护 variablesToRemove 列表,跟踪需要清理的 FastThreadLocal 实例。
  4. 支持 Netty 功能模块:

    • 对象池(Recycler):存储对象池的上下文数据,优化 ByteBuf 等对象的复用。
    • 上下文管理:在 EventLoop 或 ChannelPipeline 中存储线程特定的状态。
    • 性能优化:减少反射和内存分配,适用于高并发场景。

3. 关键方法解析

以下是 FastThreadLocal 的核心方法及其作用:

3.1 get
  • 签名:public final V get()
  • 作用:获取当前线程的线程局部变量值。
  • 逻辑:
    • 调用 InternalThreadLocalMap.get() 获取当前线程的 InternalThreadLocalMap。
    • 通过 index 从 indexedVariables 获取值。
    • 如果值为 UNSET,调用 initialize 初始化。
  • 使用场景:获取线程局部变量,如对象池中的 ByteBuf。
3.2 set
  • 签名:public final void set(V value)
  • 作用:设置当前线程的线程局部变量值。
  • 逻辑:
    • 如果 value != UNSET,设置值并加入清理列表。
    • 如果 value == UNSET,调用 remove 移除变量。
  • 使用场景:设置线程特定的上下文,如 Recycler 的对象池。
3.3 remove
  • 签名:public final void remove()
  • 作用:移除当前线程的线程局部变量。
  • 逻辑:
    • 检查变量是否为 UNSET,若不是,设置为 UNSET,从清理列表移除,并调用 onRemoval。
  • 使用场景:清理不再需要的变量,防止内存泄漏。
3.4 initialize
  • 签名:protected V initialize(InternalThreadLocalMap threadLocalMap)
  • 作用:初始化线程局部变量值。
  • 逻辑:
    • 调用 initialValue() 获取默认值(子类可重写)。
    • 设置值到 indexedVariables 并加入清理列表。
  • 使用场景:首次访问变量时提供初始值。
3.5 initialValue
  • 签名:protected V initialValue() throws Exception
  • 作用:提供默认初始值,子类可重写。
  • 默认实现:返回 null。
  • 使用场景:自定义初始值,如初始化对象池的默认对象。
3.6 onRemoval
  • 签名:protected void onRemoval(V value) throws Exception
  • 作用:变量移除时的回调,子类可重写以实现清理逻辑。
  • 使用场景:释放资源,如对象池中的对象回收。

4. 与 InternalThreadLocalMap 的关系

FastThreadLocal 依赖 InternalThreadLocalMap 实现存储:

  • 索引分配:每个 FastThreadLocal 实例通过 InternalThreadLocalMap.nextVariableIndex() 分配唯一索引,存储在 indexedVariables 数组中。
  • 高效访问:
    • get 和 set 方法通过索引直接访问 indexedVariables,避免 ThreadLocal 的哈希表操作。
    • InternalThreadLocalMap.UNSET 标记未设置的槽位,区分 null 值。
  • 清理机制:InternalThreadLocalMap 维护 variablesToRemove 列表,FastThreadLocal 的 set 和 remove 方法更新该列表,确保变量可被清理。

5. 使用场景

FastThreadLocal 的主要应用场景包括:

  1. 对象池(Recycler):

    • 存储线程局部的对象池上下文,优化 ByteBuf 等对象的复用。
    • 示例:
      private static final FastThreadLocal<Recycler.Handle> HANDLE = new FastThreadLocal<Recycler.Handle>() {
          @Override
          protected Recycler.Handle initialValue() {
              return new Recycler.Handle();
          }
      };
      
  2. 上下文管理:

    • 在 EventLoop 或 ChannelPipeline 中存储线程特定的状态。
    • 示例:缓存 ChannelHandler 的处理状态。
  3. 随机数生成:

    • 配合 InternalThreadLocalMap 的 random 字段,提供线程局部的随机数生成器。
    • 示例:负载均衡选择 EventLoop。
  4. 性能敏感场景:

    • 在高并发场景中,FastThreadLocal 提供低开销的线程局部变量访问。
    • 示例:NioEventLoop 中存储临时 I/O 上下文。

6. 与 Java ThreadLocal 的对比

特性FastThreadLocalThreadLocal
存储方式基于 InternalThreadLocalMap 的数组索引基于 ThreadLocalMap 的哈希表
性能高,索引访问避免哈希计算较低,哈希表操作可能有冲突
线程支持优化 FastThreadLocalThread,兼容普通线程支持所有线程
清理机制提供 remove 和 onRemoval 回调,防止泄漏需手动调用 remove,易泄漏
使用场景Netty 内部,如对象池、事件循环上下文通用线程局部存储
【Realtek sdk-3.4.14b】RTL8197FH+RTL8363NB当WAN/LAN IP冲突的时候,再次切换回正常的WAN,出现电脑无法上网也无法ping通设备网关问题分析及解决方案 如上图所示,当WAN和LAN网段冲突的时候,会导致路由设备异常,无法上网,但是修改为不冲突的网段之后,依然无法上网,同时下级PC也无法ping通路由设备,正常的如下图所示如上图所示,正常网络拓扑是可以正常的,但是在上级和路由LAN冲突的时候,再次切换为正常的网络也是异常问题复现步骤1.路由设备WAN口接到一个和本级路由是相同网段的设备2.拔掉WAN口,将WAN口接到一个和本级路由是不同网段的设备3.此时PC无法访问路由器。 阅读详情

相关推荐

鱼眼相机矫正实战:除了棋盘格,试试横向展开和经纬度法(OpenCV4/C++实现对比)

本文对比了鱼眼相机矫正的三种主流方法:棋盘格标定法、横向展开法和经纬度法,通过OpenCV4/C++实战代码解析,帮助开发者在自动驾驶、VR全景拼接和安防监控等场景中选择最适合的技术方案。重点分析了各方法的精度、处理速度和适用场景,为工程实践提供实用指导。

weixin_29032489的博客 283

Netty源码系列 之 FastThreadLocal源码

Netty源码系列 之 FastThreadLocal源码

Eriksen的博客 1656

【人工智能AI】是什么?

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟延伸和扩展人的智能的理论方法技术及应用系统的一门新的技术科学。(百度百科)人工智能的基本原理:机器从「特定的」大量数据中总结规律,形成某些「特定的知识」,然后将这种「知识」应用到现实场景中去解决实际问题。在这个基本原理的基础上,有3个特征:1、人工智能本质上是一种工具2、人工智能技能只能解决特定的问题,而不是什么都能做3、人工智能属于归纳逻辑,可以告诉你是什么,但是不能告诉你为什么。

KJCZ.AK的博客 2万+

Netty的FastThreadLocal

在文章ThreadLocal与FastThreadLocal中我们介绍了JDK的ThreadLocal与Netty的FastThreadLocal之间的一点区别. 这篇文章在单独介绍下FastThreadLocal. io.netty.util.concurrent.FastThreadLocal 我们先看个对比表格 JDK Netty Thread FastThreadLocalThread ThreadLocal FastThreadLocal ThreadLocalMap I

书唐瑞的博客 688

速腾RS-LiDAR-16激光雷达ROS环境搭建与点云可视化实战指南

本文提供速腾RS-LiDAR-16激光雷达在ROS环境下的完整搭建与可视化实战指南。从硬件连接、网络配置、驱动安装编译,到核心参数详解与Rviz点云可视化,手把手解决IP设置、坐标系对齐等常见问题,帮助开发者快速实现激光雷达三维点云数据的采集与显示。

weixin_29271263的博客 368

linux下wayland协议修改键盘映射

linux下wayland协议,修改键盘映射,实验环境是Ubuntu24,其他wayland协议窗口应该也是可以的。

qq_15027967的博客 1068

Netty源码解析(七)之FastThreadLocal

FastThreadLocal是Netty中常用的一个工具类,他的基本功能与JDK自带的ThreadLocal一样,但是性能优于ThreadLocal

benjam1n77的博客 1365

content-pipeline:一条可落地的内容生产流水线

content-pipeline 是一种将内容创作工程化的系统性方法,其核心在于用确定性流程替代碎片化人工操作。它基于结构化提示(prompt)、预置叙事框架与品牌参数固化三大原理,实现从素材输入到多平台发布的端到端自动化。技术价值体现在显著降低认知负荷、保障输出一致性、支持本地化资源绑定与闭环反馈校验。典型应用场景包括技术教程批量生成、跨平台(公众号/小红书/即刻)内容适配、AI写作质量可控迭代等。本文深入解析其作为‘内容制造业’基础设施的底层设计逻辑与实操路径,尤其聚焦Claude Code环境下的真实

weixin_31199559的博客 267

Netty对象池

在平时工作中,听说和使用过连接池,线程池等.还有一种就是对象池,可以实现对象复用的功能. 当然实现对象池的方式手段有多种,比如有一个公共的池子,所有需要对象的线程通过并发控制的方式从池子中获取对象,并发控制的同时伴随性能的损耗.那么Netty是如何实现对象池的呢? 先通过一段演示代码说起 import io.netty.util.Recycler; public class Book { private String name; private final Recycler.Handle

书唐瑞的博客 598

STM32CubeMX之定时器输入捕获

上一章介绍了STM32定时器的PWM输出功能,定时器的几个通道除了有输出功能外,还可以做输入用,可捕获信号的上升沿或下降沿,可以用于测量信号的频率、周期、占空比等。本篇文章将介绍用STM3...

zhang062061的专栏 1337

SAP S4 HANA:按单生产(MTO)场景中的COGS分割

本文介绍了SAP S/4HANA中提供的各种选项,以在销售订单/商品是按订单生产(以下称为MTO)生产流程中的成本对象时,在基于帐户的COPA环境中报告COGS分割信息。

adam915的博客 1191

Netty中的FastThreadLocal

Netty中的FastThreadLocal 版本:4.1.23 大家都应该接触过Jdk的ThreadLocal,它使用每个Thread中的ThreadLocalMap存储ThreadLocal,ThreadLocalMap内部使用ThreadLocalMap.Entry 数组存储每一个ThreadLocal,存储计算和HashMap类似,要计算key的索引位置=key.threadLocalH...

很多时候犯错都是在不知情的情况下发生的 4443

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3187

netty源码解读七(ThreadLocal与FastThreadLocal)

netty源码之threadLocal与fastThreadLocal对比

简单,快乐,拥抱变化 628

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

上一篇:深夜看了张一鸣的微博,让我越想越后怕作者:Joel.Wang老王来源:blog.youkuaiyun.com/mycs2012/article/details/908981281 FastTh...

emprere的博客 114

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Netty4核心原理⑥】【揭开Bootstrap的神秘面纱 - 客户端Bootstrap ❶】

本系列虽说本意是作为 《Netty4 核心原理》一书的读书笔记,但在实际阅读记录过程中加入了大量个人阅读的理解和内容,因此对书中内容存在大量删改。第七章 揭开Bootstrap的神秘面纱</</</</【Netty4核心原理】【全系列文章目录】在 Netty 中, Channel 相当于一个 Socket 的抽象,他为用户提供了关于 Socket状态、读、写等操作,每当 Netty 建立了一个连接,都创建了一个与其对应的 Channel 实例。

猫吻鱼的博客 1068

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

DeepSeek Netty源码深度分析

Netty源码设计精妙,建议结合实际问题(如高并发、内存泄漏、性能优化)进行针对性阅读,理解设计决策背后的考量。Netty源码深度分析。七、调试和性能分析技巧。二、核心组件源码分析。三、关键流程源码分析。八、常见问题源码分析。

m0_37843156的博客 416

这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。

关注java版web项目公众号后台回复pay或mall获取实战项目资料+视频Dubbo的一次提交开始故事得从前段时间翻阅 Dubbo 源码时,看到的一段代码讲起。这段代码就是这个:org....

公众号-老炮说Java 301

netty-FastThreadLocal用法测试

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

lhever_的博客 595

Netty中的FastThreadLocal类技术详解

是Netty框架提供的一个高性能的线程本地变量实现,与Java标准库中的类似,但具有更高的性能和更低的内存消耗。旨在解决Java原生在访问速度和内存占用上的问题,通过优化数据结构和管理策略,提升多线程环境下的数据访问效率。是Netty框架提供的一个高性能线程本地变量实现,通过优化数据结构和管理策略,显著提升了线程本地变量的访问速度和内存效率。在实际应用中,合理使用可以显著提高多线程程序的性能,特别是在需要频繁访问线程本地变量的场景下。

码到三十五 1290

《Netty核心代码解析》FastThreadLocal

系列FastThreadLocal目录 文章目录系列FastThreadLocal目录前言二、InternalThreadLocalMap二、FastThreadLocal 前言 Netty作为一个高性能的网络框架,针对自己的业务实现了一些API,比如FastThreadLocalThread和FastThreadLocal等。用来实现Pooled池化内存。 # 一、FastThreadLocalThread Netty自定义了Thread类,用于存储自定义的ThreadLocalMap。 publ

Turbo码先生 325

深入理解 Netty FastThreadLocal

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

vivo互联网技术 780

Netty Recycler源码解读

Recycler是一个轻量级的对象缓存池,用来实现对象的复用。下面是使用Recycler的一个简单实例: import io.netty.util.Recycler; public class RecycleTest { private static final Recycler&lt;User&gt; RECYCLER = new Recycl...

everyok的博客 440

源码解读 | JDK源码 | ThreadLocal 原理解读

文章目录核心提炼ThreadLocal 是用来干嘛的使用场景案例ThreadLocal 使用代码示例运行结果源码细节Thread 类ThreadLocal 类类签名关键方法 | set关键方法 | get其他方法ThreadLocalMap 类类签名构造方法关键方法 | set关键方法 | getEntry其他方法ThreadLocalMap 里 Entry 为何声明为 WeakReference...

壹只皮卡丘 351

解读ThreadLocal :为何能实现线程数据独立?

ThreadLocal的get方法: 当调用 ThreadLocal 的 get 方法时,实际上是在当前线程的 ThreadLocalMap 中查找对应的 ThreadLocal 对象,如果找到了,就返回该对象的值,否则返回 null。ThreadLocal的set方法: 当调用 ThreadLocal 的 set 方法时,实际上是在当前线程的 ThreadLocalMap 中插入一个键值对,其中键是 ThreadLocal 对象,值是要设置的局部变量值。了解fastThreaLocal吗?

周哥的offer秘籍 475

35道Java IO模型面试题:BIO、NIO、AIO与Netty全深度解析

同步异步与阻塞非阻塞是理解IO模型的两大核心维度,组合出的BIO、NIO、AIO分别对应了Java网络编程从传统Socket到多路复用再到异步回调的演进路径。NIO基于Buffer、Channel与Selector实现高并发多路复用,底层依赖epoll等操作系统机制;Netty则在NIO之上封装了主从Reactor线程模型、事件管道与零拷贝技术,成为网关、IM、RPC等高性能中间件的通用底座。面试中常从粘包拆包、ByteBuf内存管理、心跳断线重连到背压与源码设计层层追问,本质上是在考察工程实践能力。本文梳

weixin_34408624的博客 464
上一篇: Netty中InternalThreadLocalMap的作用
下一篇: Netty是如何解决epoll CPU占用100%问题的
Jooou
博客等级 码龄9年 226粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值