ThreadLocal的作用是可以用于保存当前线程的变量,当前线程内,可以任意获取,但每个线程往ThreadLocal里面读写数据是线程隔离,互不影响的。一个简单的例子:
1 | ThreadLocal<String> tl = new ThreadLocal<>(); |
初步解析
我们关注下他的public
方法,
get()
1 | public T get() { |
set(T value)
1 | public void set(T value) { |
remove()
1 | public void remove() { |
通过上面的代码我们就可以基本了解并使用ThreadLocal了,他就是用于存储不同线程的自身数据,而且线程之间互不影响,一个ThreadLocal
对象能存储一种数据,每个线程可以有多个ThreadLocal
对象。然后我们就需要深入的了解一下关于他是如何存储的了,即ThreadLocalMap
类的具体源码分析。
ThreadLocalMap
首先,我们的Thread
类中,有一个变量,即threadLocals
,它是ThreadLocalMap
类型的,我们在调用ThreadLocal
的get/set
的时候,就是读取/写入threadLocals
中。它是ThreadLocal
的内部静态类,是一个键值对类型,它的Entry
类定义是:
1 | static class Entry extends WeakReference<ThreadLocal<?>> { |
可以看到key是ThreadLocal
,value是我们的存储的参数类型,但是需要注意他是继承自WeakReference
的,即我们存储的ThreadLocalMap
中的数据是可能会被回收掉的,这个WeakReference
中的key
就是我们的ThreadLocal
。
属性:
1 | private static final int INITIAL_CAPACITY = 16; // 默认map大小 |
构造方法:
1 | // ThreadLocal中默认计算存储在ThreadLocalMap中的index的方法 |
其他的一些方法与Map也是类似的,比如插入,删除,扩容等,这里就不再赘述了。