美文网首页
ThreadLocal源码解析

ThreadLocal源码解析

作者: 码上述Andy | 来源:发表于2019-07-14 21:31 被阅读0次

1.概述

多线程并发时用于存储当前线程的本地变量副本。

2. ThreadLocal解析

public void set(T value)
public T get()
public void remove()
private T setInitialValue() 

set:用于存储当前线程的副本变量值
get:获取当前线程的副本变量值
remove:移除ThreadLocalMap中当前线程的副本变量值
setInitialValue:初始化当前线程的副本变量值
具体看源码实现:

set方法

public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

1.获取当前线程
2.去ThreadLocalMap中去取map
3.当map不为空时就将当前副本值和ThreadLocal存入map中
4.当map为空时创建一个ThreadLocalMap,并将当前副本值和ThreadLocal存入map中。

get方法

public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

1.获取当前线程。
2.ThreadLocalMap中是否存有当前的线程副本。
3.当map非空时,从ThreadLocalMap中取出Entry,Entry其实就是table数组。然后获取当前ThreadLocal对应的value。
4.初始化一个本地副本变量。

remove方法

public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }

remove方法很简单
1.从ThreadLocalMap中获取当前线程的map。
2.非空就remove掉,为空什么都不做。

setInitialValue方法

private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

protected T initialValue() {
        return null;
    }

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

get方法中会调用到setInitialValue方法。
1.initialValue初始化变量值为protected方法,为子类实现。
2.从当前线程中获取ThreadLocalMap。
3.不为空则将副本值存入当前的ThreadLocal为key的map中。
4.为空就创建。

3. ThreadLocalMap解析

待补充

相关文章

  • Netty 源码分析-目录

    Netty源码分析1 - Promise异步框架的设计Netty源码分析2 - ThreadLocal 源码解析N...

  • Netty源码分析3 - FastThreadLocal 框架的

    在 第二章 ThreadLocal源码解析 详细分析了jdk本身的ThreadLocal源码。本节来看一下nett...

  • ThreadLocal原理解析(2):ThreadLocalMa

    我的CSDN博客同步发布:ThreadLocal原理解析(2):ThreadLocalMap源码解析 转载请注明出...

  • ThreadLocal源码解析

    一、使用场景 ThreadLocal用于不同线程获取各自数据,同一个线程也可根据不同的threadlocal对象获...

  • ThreadLocal源码解析

    ThreadLocal 1. ThreadLocal 是什么? 源码中解释到 ThreadLocal 就用于存储数...

  • ThreadLocal源码解析

    引言 ThreadLocal,线程变量,线程可以将本次线程内经常使用的变量存储到ThreadLocal中,方便本次...

  • threadLocal源码解析

    简单记录一些看threadLocal时遇到比较有意思的点。 ThreadLocalMap ThreadLocal的...

  • ThreadLocal源码解析

    概述 ThreadLocal,即线程本地变量,它为每一个使用该变量的线程提供独立的变量副本,每一个线程都可以独立地...

  • ThreadLocal源码解析

    ThreadLocal源码阅读记录,如有不妥,欢迎指出,共同学习,谢谢! 一、简单使用 ThreadLocal可以...

  • ThreadLocal源码解析

    1.概述 多线程并发时用于存储当前线程的本地变量副本。 2. ThreadLocal解析 set:用于存储当前线程...

网友评论

      本文标题:ThreadLocal源码解析

      本文链接:https://www.haomeiwen.com/subject/luafkctx.html