表面理解:他其实就是一个本地线程,可以实现线程绑定技术,简单来说就是将一个对象存入当前线程中,在后续执行流程中,任意位置都可以获得对象数据,从而实现线程内的数据共享。
底层理解:ThreadLocal是一种线程隔离机制,它保证了多线程访问下,对共享变量访问的安全性,在解决多线程访问共享变量情况下一般方法都是加锁,保证同一时刻只有一个线程对共享变量进行修改,但是加锁会带来一个性能下降问题,所有ThreadLocal采用了一个空间换时间的思想,他在每个线程里边有一个容器,这个容器是用来储存共享变量的一个副本,然后每个线程只对自己的副本进行操作,就不会发生线程安全问题,又避免使用锁的一个开销,它底层是由map结构存储的,属于一个强引用,所以使用完要remove,不然会一直存在,容器易造成内存泄漏。
ThreadLcoal 的应用场景:
service控制服务和dao访问db,使用conn,必须是同一个。
mybatis控制事务的sqlsession和访问db的使用sqlsession,必须是同一个。
在filter中,拦截通用的参数,处理完毕后,在后续controller service 任意位置都可以直接获取值,比如:分页参数
ThreadLocal底层数据结构
thread中有一个map结构存放数据,ThreadLocal可以访问这个默认访问权限的Map。ThreadLocal就是操作线程存储空间的工具。