说一下ThreadLocal
ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据。
ThreadLocal底层是通过 TreadLocalMap来实现的,每个Thread对象中都存在一个 ThreadLocalMap,Map的key为 ThreadLocal对象,Map的 value为需要缓存的值 。
ThreadLocalMap由一个个 Entry对象构成 Entry继承自 WeakReference< Threadlocal>,一个 Entry由 Threadlocal对象和 object构成,由此可见,Entry的key是 Threadlocal对象,并且是一个弱引用。当没指向key的强引用后,该key就会被垃圾收集器回收
当执行set方法时, Threadlocal首先会获取当前线程对象,然后获取当前线程的 ThreadLocalMap对象。再以当前 Threadlocal对象为key,将值存储进 Threadlocalmap对象中
get方法执行过程类似,Threadloca首先会获取当前线程对象,然后获取当前线程的 ThreadLocalMap对象。再以当前 ThreadLocal对象为key,获取对应的value
由于每条线程均含有各自私有的 ThreadLocalMap容器,这些容器相互独立互不影响,因此不会存在线程安全性问题,从而也无需使用同步机制来保证多条线程访问容器的互斥性。
使用场景:
在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束
线程间数据隔离
进行事务操作,用于存储线程事务信息
数据库连接,Session会话管理
Spring框架在事务开始时会给当前线程绑定一个 Jdbc Connection,在整个事务过程都是使用该线程定的connection来执行数据库操作,实现了事务的隔离性, spring框架里面就是用的 Threadlocal来实现这种隔离。
给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili