千家信息网

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

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本文小编为大家详细介绍"Netty分布式FastThreadLocal的set方法怎么用",内容详细,步骤清晰,细节处理妥当,希望这篇"Netty分布式FastThreadLocal的set方法怎么用
千家信息网最后更新 2025年01月23日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安全错误 数据库的锁怎样保障安全 邯郸工业软件开发哪家可靠 宁波小鲸网络技术 电脑方舟怎么快速搜服务器 朝阳区网络安全等级保护 贵州服务器硬盘质量好 新洲区国际网络安全维护怎么样 给wifi换服务器会有什么影响 数据库怎么删除表中数据文件 四川省统计局微观数据库 网络安全维护表格模板 我国网络安全保险保费收入 字节顺序对软件开发的影响 网络营销软件开发程序 中国农行软件开发部校园招聘 上海浦东新区软件开发公司 广州大行情网络技术有限公司 乌鲁木齐导航软件开发 编程属于软件开发么 城轨网络技术应用实训总结 沈阳东程软件开发 零售企业用什么软件开发 阿里云服务器安装系统 怎么介绍软件开发工作室 普陀区定制网络技术价格查询 怎么销售服务器 cdn服务器断开 app订制软件开发服务价格 网络安全防范指南 网络安全黑板报是什么 网页读取数据库显示乱码问题
0