看了一些博客,对ThreadLocal有了一个初步的认识。
首先要明白ThreadLocal并不是一个Thread,而是Thread的局部变量
1、每个thread维护着一个threadlocalmap的引用
2、ThreadLocalMap是ThreadLocal内部类。ThreadLocalMap中的key为ThreadLocal对象,value为要存储的对象
3、调用threadlocal的set方法时,实际上是往threadlocalmap设置值,key是ThreadLocal对象,值是传递进来的对象
4、调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象
5、ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,比如定义一个static变量,同步访问,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
ThreadLocal的对象关系引用图: