通常情况下,我们创建的变量是可以被任何⼀个线程访问并修改的。如果想实现每⼀个线程都有⾃⼰的专属本地变量该如何解决呢?JDK 中提供的ThreadLocal类正是为了解决这样的问题。

ThreadLocal类主要解决的就是让每个线程绑定⾃⼰的值,可以将ThreadLocal类形象的⽐喻成存放数据的盒⼦,盒⼦中可以存储每个线程的私有数据。

如果你创建了⼀个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使⽤get()set()⽅法来获取默认值或将其值更改为当前线程所存的副本的值,从⽽避免了线程安全问题。

比如SimpleDateFormat这个日期格式化了,一些人会把SimpleDateFormat定义为静态变量,这样不用重复创建对象,但是这个类是线程不安全的,如果多个线程同时格式化会出问题,这个时候就可以用ThreadLocal来包一下SimpleDateFormat,这样每个线程都有自己的格式化类,避免了共享,也就没有线程安全问题,也不需要频繁的创建SimpleDateFormat对象了。

还有ThreadLocal用来上下文传递。比如调用链路很长,很多方法都可能公用一个变量,此时就可以把这个变量塞到ThreadLocal中,这样每个方法就可以获取和修改这个变量,且没有线程安全问题,也简化了变量传递的复杂度。

最后修改日期: 2021年11月29日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。