Netty分布式FastThreadLocal的set方法实现逻辑剖析

 更新时间:2022年03月29日 15:56:32   作者:向南是个万人迷  
这篇文章主要为大家介绍了Netty分布式FastThreadLocal的set方法实现逻辑剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

上一小节我们学习了FastThreadLocal的创建和get方法的实现逻辑, 这一小节学习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 { }

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

以上就是FastThreadLocal的set方法的实现,更多关于Netty分布式FastThreadLocal的set方法的资料请关注脚本之家其它相关文章!

相关文章

  • JAVA把结果保留两位小数的3种方法举例

    JAVA把结果保留两位小数的3种方法举例

    在写程序的时候,有时候可能需要设置小数的位数,所以下面这篇文章主要给大家介绍了关于JAVA把结果保留两位小数的3种方法,文章通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Java责任链模式模板代码分享

    Java责任链模式模板代码分享

    这篇文章主要介绍了Java责任链模式模板代码分享,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java实现纸牌游戏之小猫钓鱼算法

    java实现纸牌游戏之小猫钓鱼算法

    这篇文章主要为大家详细介绍了java实现纸牌游戏之小猫钓鱼算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • IDEA中使用Git的图文教程

    IDEA中使用Git的图文教程

    本文主要介绍了IDEA中使用Git的图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 深入理解DevOps+微服务框架

    深入理解DevOps+微服务框架

    这篇文章主要介绍了深入理解DevOps+微服务,主要包括DevOps 的三大支柱之中,即人(People)、流程(Process)和平台(Platform)的知识讲解,需要的朋友可以参考下
    2022-05-05
  • springsecurity实现登录验证以及根据用户身份跳转不同页面

    springsecurity实现登录验证以及根据用户身份跳转不同页面

    Spring Security是一种基于Spring框架的安全技术,用于实现身份验证和访问控制,本文介绍了如何使用Spring Security,结合session和redis来存储用户信息,并通过编写特定的登录处理类和Web配置,实现用户登录和注销功能
    2024-09-09
  • Mapper层继承BaseMapper<T>需要引入的pom依赖方式

    Mapper层继承BaseMapper<T>需要引入的pom依赖方式

    这篇文章主要介绍了Mapper层继承BaseMapper<T>需要引入的pom依赖方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • maven子模块相互依赖打包时报错找不到类的解决方案

    maven子模块相互依赖打包时报错找不到类的解决方案

    本文主要介绍了maven子模块相互依赖打包时报错找不到类的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java foreach相关原理及用法解析

    Java foreach相关原理及用法解析

    这篇文章主要介绍了Java foreach相关原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • RestTemplate自定义ErrorHandler方式

    RestTemplate自定义ErrorHandler方式

    这篇文章主要介绍了RestTemplate自定义ErrorHandler方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论