千家信息网

Netty分布式FastThreadLocal的set方法怎么用

发表于:2025-11-18 作者:千家信息网编辑
千家信息网最后更新 2025年11月18日,本文小编为大家详细介绍"Netty分布式FastThreadLocal的set方法怎么用",内容详细,步骤清晰,细节处理妥当,希望这篇"Netty分布式FastThreadLocal的set方法怎么用
千家信息网最后更新 2025年11月18日Netty分布式FastThreadLocal的set方法怎么用

本文小编为大家详细介绍"Netty分布式FastThreadLocal的set方法怎么用",内容详细,步骤清晰,细节处理妥当,希望这篇"Netty分布式FastThreadLocal的set方法怎么用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

FastThreadLocal的set方法实现

set方法, 其实就是修改线程共享对象, 作用域只是当前线程, 我们回顾根据上一小节demo中, 其中一个线程set对象的过程:

线程set对象

new Thread(new Runnable() {    @Override    public void run() {        Object obj  = fastThreadLocalDemo.fastThreadLocalTest.get();        try {            for (int i=0;i<10;i++){                fastThreadLocalDemo.fastThreadLocalTest.set(new Object());                Thread.sleep(1000);            }        }catch (Exception e){            e.printStackTrace();        }    }}).start();

我们跟到set方法中:

public final void set(V value) {    if (value != InternalThreadLocalMap.UNSET) {        set(InternalThreadLocalMap.get(), value);    } else {        remove();    }}

这里首先判断我们当前设置的对象是不是UNSET, 因为这里不是UNSET, 所以进到if块中

if块调用了重载的set方法, 参数仍然为InternalThreadLocalMap, 有关InternalThreadLocalMap的get操作, 上一小节已经进行过分析, 这里不再赘述, 同时, 参数也传入了set的value值

我们跟到重载的set方法中:

public final void set(InternalThreadLocalMap threadLocalMap, V value) {    if (value != InternalThreadLocalMap.UNSET) {        if (threadLocalMap.setIndexedVariable(index, value)) {            addToVariablesToRemove(threadLocalMap, this);        }    } else {        remove(threadLocalMap);    }}

这里我们重点关注 if (threadLocalMap.setIndexedVariable(index, value)) 这部分, 这里通过threadLocalMap调用setIndexedVariable方法进行对象的设置, 传入了当前FastThreadLocal的下标和value

我们跟到setIndexedVariable中

public boolean setIndexedVariable(int index, Object value) {    Object[] lookup = indexedVariables;    if (index < lookup.length) {        Object oldValue = lookup[index];        lookup[index] = value;        return oldValue == UNSET;    } else {        expandIndexedVariableTableAndSet(index, value);        return true;    }}

这里的逻辑其实和get非常类型, 都是直接通过索引操作的, 这里根据索引值, 直接通过数组下标的方式对元素进行设置, 熟悉上一小节内容的同学对此应该不会陌生

回到FastThreadLocal的Set方法中:

public final void set(V value) {    if (value != InternalThreadLocalMap.UNSET) {        set(InternalThreadLocalMap.get(), value);    } else {        remove();    }}

刚才我们分析了如果修改的对象不是UNSET对象的操作, 如果修改的对象是UNSET对象, 则会调用remove方法

跟进remove方法:

public final void remove(InternalThreadLocalMap threadLocalMap) {    if (threadLocalMap == null) {        return;    }    Object v = threadLocalMap.removeIndexedVariable(index);    removeFromVariablesToRemove(threadLocalMap, this);    if (v != InternalThreadLocalMap.UNSET) {        try {            onRemoval((V) v);        } catch (Exception e) {            PlatformDependent.throwException(e);        }    }}

Object v = threadLocalMap.removeIndexedVariable(index)

这一步是根据索引index, 将值设置成UNSET

我们跟进removeIndexedVariable方法

public Object removeIndexedVariable(int index) {    Object[] lookup = indexedVariables;    if (index < lookup.length) {        Object v = lookup[index];        lookup[index] = UNSET;        return v;    } else {        return UNSET;    }}

这里的逻辑也比较简单, 根据index通过数组下标的方式将元素设置成UNSET对象

回到remove方法中:

if (v != InternalThreadLocalMap.UNSET)

这里判断如果我们设置的值不是UNSET对象, 则会调用onRemoval方法

跟进onRemoval方法:

protected void onRemoval(@SuppressWarnings("UnusedParameters") V value) throws Exception { }

这里是个空实现, 用于交给子类去完成

读到这里,这篇"Netty分布式FastThreadLocal的set方法怎么用"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

方法 对象 线程 分布式 下标 内容 小节 文章 索引 上一 元素 参数 数组 方式 逻辑 分析 妥当 陌生 作用 只是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 c 万能数据库打开 核心节点数据库系统重大故障是指 本田汽车网络安全 数据库四要素是什麽 2004年西安软件开发公司 消防队网络安全大排查 网络安全教总结 软件开发涉及什么技术 游戏服务器搭建是什么 软件开发项目经理常用术语0 面向用户软件开发架构 魔兽世界推荐的服务器 办公自动化是网络技术吗 四川正规软件开发服务以客为尊 w10怎么打开数据库连接 网络安全法实施范围 网络安全教育主题班会幼儿园 数据库完成开户业务代码 软件开发技术人员管理 第二银河手机版有几个服务器 外汇mt4服务器管理下载 我的世界0.9.5服务器 姑苏区进口服务器高质量的选择 上海耘恪互联网科技有限公司 平度微信小程序软件开发哪家好 城域网网络安全整改情况 软件开发 开票税率 数据库中的二维数据库有哪些特点 大型服务器数据库 北京市公安局网络安全宣传
0