每一个Thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中所有ThreadLocal对象及其对应的值
ThreadLocalMap由一个个Entry对象构成
Entry继承自WeakReference
当执行set()方法时,ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadLocalMap对象,再以当前ThreadLocal对象为key,将值存储进ThreadLocalMap对象中
get()方法执行类似。ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadLocalMap对象,再以ThreadLocal对象为key,获取对应的value。
由于每一条线程均含有各自私有的ThreadLocalMap容器,这些容器相互独立互不影响,因此不会存在线程安全性问题,从而也无需使用同步机制来保证多条线程访问容器的互斥性。
使用场景:
1.在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束
2.线程间数据隔离
3.进行事务操作,用于存储线程事务信息
4.数据库连接,Session会话管理
Spring 容器在事务开始时会给当前线程绑定一个Jdbc Connection,在整个整个事务过程都是使用该线程绑定的 connection来执行数据库操作,实现了事务的隔离性,Spring框架里面就是用的ThreadLocal来实现这种隔离



