实现每一个线程都有自己的专属本地变量。
一个ThreadLocal
变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal
变量名的由来。他们可以使用 get()
和 set()
方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。
底层是怎么实现的?
每个Thread线程内部底层都有一个静态内部类ThreadLocalMap,默认情况下是null。只有当前线程调用 ThreadLocal
类的 set
或get
方法时才创建它。实际调用的是ThreadLocalMap类对应的 get()、set()方法。最终的变量是放在了当前线程的 ThreadLocalMap
中。
每个Thread
中都具备一个ThreadLocalMap
,而ThreadLocalMap
可以存储以ThreadLocal
为 key ,Object 对象为 value 的键值对。以当前线程作为key,获取到调用set方法时设置的值。
什么场景下使用?
-
线程间数据隔离,各线程的 ThreadLocal 互不影响
-
登录功能存入用户id,在后续使用时取出
使用需要注意,可能造成内存泄漏。
避免内存泄漏的方法是,使用完毕必须调用ThreadLocal的remove()方法。