• ThreadLocal个人理解梳理


    记录一下自己对ThreadLocal的理解。

    看了《实战java高并发程序设计》的书,里面有关于ThreadLocal的讲解,里面提到了ThreadLocal,ThreadLocalMap,threadlocals,entry等,看了半天没明白。

    一个ThreadLocal在多线程中是如何存储的?

    如果代码中定义了多个ThreadLocal,又是如何存储的?

    先看下比较重要的set和get方法

    #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);
        }
    
    #get
    public T get() {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null) {
                ThreadLocalMap.Entry e = map.getEntry(this);
                if (e != null)
                    return (T)e.value;
            }
            return setInitialValue();
        }
    View Code

    先解释定义一个ThreadLocal的存储

    每一个线程进来后,使用set方法,用线程作为key去查threadlocals(这是个变量,类型就是ThreadLocalMap)中是不是有值(这个值,就是一个entry类型),如果有entry,就将entry.value设置成新值,否则就创建一个entry。这里针对只有一个ThreadLocal变量的时候,创建一个entry其实也是创建一个threadlocals。所以最后每个线程中都有一个自己的threadlocals,里面存的就是自己要设置的值。

    那多个ThreadLocal变量呢?

    其实这里重要的就是entry了,ThreadLocalMap中其实有一组entry,而entry其实也是类似map的结构,map的key就是ThreadLocal的变量名,value就是真实要设置的值。这样就可以保证了在每个线程中,threadlocals保存了不同的ThreadLocal变量的value值

  • 相关阅读:
    太忙了
    Delphi 的接口(2) 第一个例子
    Delphi 的接口(3) 关于接口的释放
    VS.NET让我做了一场恶梦
    [推荐阅读]The Best Of .The NET 1.x Years
    向大家说声对不起
    [致歉]16:30~17:10电信网络出现问题
    服务器恢复正常
    [SharePoint]更改活动目录(AD)中用户名的问题
    [正式决定]博客园开始接受捐助
  • 原文地址:https://www.cnblogs.com/tianphone/p/10954356.html
Copyright © 2020-2023  润新知