ThreadLocal解析

ThreadLocal的作用

ThreadLocal常用来保存线程的私有数据,用它来完成线程之间的数据隔离,达到数据同步安全的目的,线程利用ThreadLocal来保存一份数据副本在其内部。下面我们就来分析下ThreadLocal的内部实现原理。

关键类

  • ThreadLocal$ThreadLocalMap
    • ThreadLocal的内部类,其内部用一个Entry[]数组,来描述和封装一个存储ThreadLocalMap$Entry 的散列表,是散列表的话,那肯定有散列冲突,和散列函数。
      • 散列冲突:这里用来解决散列冲突的方法是开放地址线性探测的方式。可以在ThreadLocalMap的set(value)函数中体现出来。
      • 散列函数:这里的散列函数是通过ThreadLocal对象取hashCode然后对散列数组的长度取模映射到数组下标。
  • ThreadLocalMap$Entry
    • 用来保存键值对信息的,key=ThreadLocal对象 value=要保存的值,其中Entry继承了WeakReference,所以entry.get()是有可能==null,当entry.get()==null时,说明这个key值对应的散列表位置中的元素已经没被引用了,所以此时这个元素在新元素插入的时候冲突探测到这个位置时,可以直接替换掉他。ThreadLocalMap set()方法中有体现。

Thread是怎么利用ThreadLocal来实现本地变量的保存的?

  • 1、Thread类中持有了一个ThreadLocalMap成员变量。
  • 2、每次ThreadLocal 调用set(value) 或者get()方法的时候,在方法内部都会拿当前线程的引用对象。
  • 3、2中获取到Thread引用对象之后,然后再拿到1中说的ThreadLocalMap引用对象。这个对象在Thread对象创建的时候就已经被创建好了。后面所有的操作都是基于这个ThreadLocalMap散列表。
  • 4、所以最终ThreadLocal所有的操作都会转化成对当前线程有效的操作。

你可能感兴趣的:(个人,技术,笔记)