7 【ThreadLocal六连问,你扛得住吗? - 程序员大彬 | 小红书 - 你的生活指南】 😆 AaISgO579ax2fHQ 😆 http://xhslink.com/7QDwZR

Untitled

场景1

ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本,而不会影响其他线程的副本,确保了线程安全。

这种场景通常用于保存线程不安全的工具类,典型的使用的类就是 SimpleDateFormat。

假如需求为 500 个线程都要用到 SimpleDateFormat,使用线程池来实现线程的复用,否则会消耗过多的内存等资源,如果我们每个人物都创建了一个 simpleDateFormat 对象,也就是说,500 个任务对应 500 个 simpleDateFormat 对象。但是这么多对象的创建是由开销的,而且这么多对象同时存在在内存中也是内存的浪费。可以将 simpleDateFormat 对象给提取了出来,变成静态变量,但是这样一来就会有线程不安全的问题。我们想要的效果是,既不浪费过多的内存,同时又想保证线程安全。此时,可以使用 ThreadLocal 来达到这个目的,每个线程都拥有一个自己的 simpleDateFormat 对象。

场景2

ThreadLocal 用作每个线程内需要独立保存信息,以便供其他方法更方便地获取该信息的场景。每个线程获取到的信息可能都是不一样的,前面执行的方法保存了信息后,后续方法可以通过 ThreadLocal 直接获取到,避免了传参,类似于全局变量的概念。

比如 Java web 应用中,每个线程有自己单独的 Session 实例,就可以使用 ThreadLocal 来实现。