《ThreadLocal“你”真的了解吗?(一)》这篇文章梳理了ThreadLocal的基础知识,同时还梳理了java中线程的创建方法以及这两者之间的关系,本篇文章我们将继续梳理与ThreadLocal相关,在上一节也提过的另一组件ThreadLocalMap。
ThreadLocalMap是Java中ThreadLocal类中的一个内部类,其主要作用是用于实现线程的本地存储(ThreadLocalStorage,即TLS)的功能。每个线程都有一个与之关联的ThreadLocalMap,在这个map中,键是ThreadLocal对象,值则是我们真正想要在当前线程中保存和隔离的变量。
当我们在一个线程中调用ThreadLocal的get()或set()方法时,实际上就是在操作该线程对应的ThreadLocalMap。这样就能保证每个线程只能访问到自己线程局部变量的副本,而不会影响其他线程中的副本,从而有效地避免了多线程环境下的数据共享问题。
需要注意的是,ThreadLocalMap使用弱引用(WeakReference)来存储ThreadLocal实例作为其键。这意味着如果只有ThreadLocalMap引用了ThreadLocal实例,而没有其他强引用指向ThreadLocal实例,那么在垃圾回收时,这个ThreadLocal实例及其在ThreadLocalMap中对应的值都可能被回收,以防止内存泄漏。但这也可能导致一些不易察觉的问题,比如预期的数据无法获取,因此在使用ThreadLocal时应确保正确管理其生命周期。