ThreadLocal

本贴最后更新于 546 天前,其中的信息可能已经水流花落

wolfganghasselmannuNr07wgn5y4unsplash.jpg

功能

源码

使用流程

先看下面这段代码

public class ThreadLocalRunner {
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                threadLocal.set(0);
                for (int j = 1; j <= 100; j++) {
                    threadLocal.set(threadLocal.get() + j);
                }
                System.out.println("线程" + Thread.currentThread() + "的执行结果为:" + threadLocal.get());
            }).start();
        }
    }
}

这段代码的运行结果会是下面这样的
UHwqkq.png

10 个线程都是用的同一个 threadLocal 对象,但是在使用 threadLocal.set(xx) 时会创建各自的 ThreadLocalMap 对象并且绑定在自己的线程对象里,代码如下

    // java.lang.ThreadLocal.java
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
  
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

当调用 threadLocal.get() 方法时也是使用自己线程的 ThreadLocalMap 对象获取值,代码:

    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();
    }
  
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
  • 代码
    447 引用 • 545 回帖 • 6 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3012 引用 • 8158 回帖 • 548 关注

相关帖子

3 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...