ThreadLocal源码理解

缘起

平时开发、看源码经常会遇到ThreadLocal的使用,一直以来理解的不是那么清晰,只知道内部应该是某种类似map的实现,从而达到不同的线程调用get可以获取到不一样的值,仅此而已。趁着前一阵子中秋放假,正好有空,遂决定一探究竟,接下来我主要列下对源码的理解。

注意:本文研究的源码版本是Android6.0 sdk里的,实现有别于JDK中的版本。

1. 含义&用法

线程本地存储对象,同一个对象实例可以在多个Thread中操作,每个线程可以在这个对象上设置一个关联的值,各个线程看到的都是自己的值,互相之间不会影响;
在代码中一般作为静态字段使用,如Looper.java里面的:

// sThreadLocal.get() will return null unless you've called prepare().
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

2. 初始值

可以通过覆写initialValue()方法提供个自定义的值;

3. set方法

代码如下:

    public void set(T value) {
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread); // 拿到跟当前线程关联的values字段
        if (values == null) {
            values = initializeValues(currentThread);
        }
        values.put(this, value); // 将this、value对,放到这个结构中
    }

    /**
     * Gets Values instance for this thread and variable type.
     */
    Values values(Thread current) {
        return current.localValues;
    }

每个Thread对象有一个这里的Values类型的localValues字段。

4. Values结构:

Values结构

这里的重点是里面的private Object[] table; 数组;
因为同一个线程可以创建多个ThreadLocal对象,所以这里用了一个数组来存储!!!数组中的存储方式是接连着存放,比如0,1位置是一对,分别对应key(ThreadLocal对象本身)、value,2和3位置是一对等等,数组长度一定是2的power(次方)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为啥要写这篇文章 起初我看Handler相关源码,看到Looper里面有个ThreadLocal,如下,而这个Th...
    xufang2阅读 2,686评论 4 51
  • Android Handler机制系列文章整体内容如下: Android Handler机制1之ThreadAnd...
    隔壁老李头阅读 7,670评论 4 30
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,360评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,890评论 18 139
  • 还是一个课间,一向安静的一班门口堆满了人。听说好像来了个很帅的新生诶!我放下作业被雪落拉着去看热闹。刚一看到...
    布丁晓芷阅读 145评论 0 0