Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)—->第2节: FastThreadLocal的set方法…

释放双眼,带上耳机,听听看~!

Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)—->第2节: FastThreadLocal的set方法

 

Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler

 

第二节: FastThreadLocal的set方法

 

上一小节我们学习了FastThreadLocal的创建和get方法的实现逻辑, 这一小节学习FastThreadLocal的set方法的实现逻辑

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1new Thread(new Runnable() {
2    @Override
3    public void run() {
4        Object obj  = fastThreadLocalDemo.fastThreadLocalTest.get();
5        try {
6            for (int i=0;i<10;i++){
7                fastThreadLocalDemo.fastThreadLocalTest.set(new Object());
8                Thread.sleep(1000);
9            }
10        }catch (Exception e){
11            e.printStackTrace();
12        }
13    }
14}).start();
15

我们跟到set方法中:


1
2
3
4
5
6
7
8
1public final void set(V value) {
2    if (value != InternalThreadLocalMap.UNSET) {
3        set(InternalThreadLocalMap.get(), value);
4    } else {
5        remove();
6    }
7}
8

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

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

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


1
2
3
4
5
6
7
8
9
10
1public final void set(InternalThreadLocalMap threadLocalMap, V value) {
2    if (value != InternalThreadLocalMap.UNSET) {
3        if (threadLocalMap.setIndexedVariable(index, value)) {
4            addToVariablesToRemove(threadLocalMap, this);
5        }
6    } else {
7        remove(threadLocalMap);
8    }
9}
10

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

我们跟到setIndexedVariable中:


1
2
3
4
5
6
7
8
9
10
11
12
1public boolean setIndexedVariable(int index, Object value) {
2    Object[] lookup = indexedVariables;
3    if (index < lookup.length) {
4        Object oldValue = lookup[index];
5        lookup[index] = value;
6        return oldValue == UNSET;
7    } else {
8        expandIndexedVariableTableAndSet(index, value);
9        return true;
10    }
11}
12

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

回到FastThreadLocal的Set方法中:


1
2
3
4
5
6
7
8
1public final void set(V value) {
2    if (value != InternalThreadLocalMap.UNSET) {
3        set(InternalThreadLocalMap.get(), value);
4    } else {
5        remove();
6    }
7}
8

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

跟进remove方法:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1public final void remove(InternalThreadLocalMap threadLocalMap) {
2    if (threadLocalMap == null) {
3        return;
4    }
5    Object v = threadLocalMap.removeIndexedVariable(index);
6    removeFromVariablesToRemove(threadLocalMap, this);
7    if (v != InternalThreadLocalMap.UNSET) {
8        try {
9            onRemoval((V) v);
10        } catch (Exception e) {
11            PlatformDependent.throwException(e);
12        }
13    }
14}
15

 
Object v = threadLocalMap.removeIndexedVariable(index) 这一步是根据索引index, 将值设置成UNSET

我们跟进removeIndexedVariable方法:


1
2
3
4
5
6
7
8
9
10
11
1public Object removeIndexedVariable(int index) {
2    Object[] lookup = indexedVariables;
3    if (index < lookup.length) {
4        Object v = lookup[index];
5        lookup[index] = UNSET;
6        return v;
7    } else {
8        return UNSET;
9    }
10}
11

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

回到remove方法中:

 
if (v != InternalThreadLocalMap.UNSET) 这里判断如果我们设置的值不是UNSET对象, 则会调用onRemoval方法

跟进onRemoval方法:


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

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

以上就是FastThreadLocal的set方法的实现

 

上一节: FastThreadLocal的使用和创建

下一节: recycler的使用和创建

posted on
2019-01-02 15:16 向南是个万人迷 阅读(
…) 评论(
…) 编辑 收藏

转载于:https://www.cnblogs.com/xiangnan6122/p/10208719.html

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 4 Flex(弹性)布局

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索