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

作者:向南是个万人迷 时间:2021-08-22 04:51:54 

上一小节我们学习了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 { }

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

来源:https://www.cnblogs.com/xiangnan6122/p/10208719.html

标签:Netty,分布式,FastThreadLocal,set
0
投稿

猜你喜欢

  • Springboot使用@RefreshScope注解实现配置文件的动态加载

    2022-06-11 10:06:00
  • Java中的Object类详细介绍

    2023-11-23 23:18:46
  • 详解idea maven nexus 常见命令配置

    2021-06-07 18:29:03
  • Java sha1散列算法原理及代码实例

    2021-06-28 05:50:22
  • 老生常谈比较排序之归并排序(递归)

    2022-05-15 11:43:15
  • Android控件CardView实现卡片布局

    2022-12-05 02:10:32
  • Java毕业设计实战之仿小米电子产品售卖商城系统的实现

    2022-09-29 10:19:47
  • C#实现简单屏幕监控的方法

    2023-07-31 10:29:25
  • Java遍历Map对象的四种方式

    2022-05-07 14:30:04
  • Java日常练习题,每天进步一点点(33)

    2023-09-22 05:32:41
  • SpringBoot如何实现分离资源文件并打包

    2023-02-18 12:01:49
  • Java多线程事务管理的实现

    2023-07-26 22:58:20
  • Android 用HttpURLConnection访问网络的方法

    2023-05-18 17:33:01
  • java简单实现复制 粘贴 剪切功能代码分享

    2023-10-14 05:08:23
  • 批处理一键安装JDK/一键安装JRE和自动配置Java环境变量

    2023-11-29 05:28:30
  • 详解C#对XML、JSON等格式的解析

    2022-06-04 22:45:50
  • Android使用Websocket实现聊天室

    2023-07-07 13:01:59
  • Android实现自定义华丽的水波纹效果

    2023-10-03 23:12:50
  • java堆排序概念原理介绍

    2021-08-30 12:31:58
  • Java中利用gson解析Json实例教程

    2023-10-31 04:07:41
  • asp之家 软件编程 m.aspxhome.com