通常情况下,我们创建的变量是可以被任何⼀个线程访问并修改的。如果想实现每⼀个线程都有⾃⼰的专属本地变量该如何解决呢?JDK 中提供的ThreadLocal
类正是为了解决这样的问题。
ThreadLocal
类主要解决的就是让每个线程绑定⾃⼰的值,可以将ThreadLocal
类形象的⽐喻成存放数据的盒⼦,盒⼦中可以存储每个线程的私有数据。
如果你创建了⼀个ThreadLocal
变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal
变量名的由来。他们可以使⽤get()
和set()
⽅法来获取默认值或将其值更改为当前线程所存的副本的值,从⽽避免了线程安全问题。
比如SimpleDateFormat
这个日期格式化了,一些人会把SimpleDateFormat
定义为静态变量,这样不用重复创建对象,但是这个类是线程不安全的,如果多个线程同时格式化会出问题,这个时候就可以用ThreadLocal
来包一下SimpleDateFormat
,这样每个线程都有自己的格式化类,避免了共享,也就没有线程安全问题,也不需要频繁的创建SimpleDateFormat
对象了。
还有ThreadLocal
用来上下文传递。比如调用链路很长,很多方法都可能公用一个变量,此时就可以把这个变量塞到ThreadLocal
中,这样每个方法就可以获取和修改这个变量,且没有线程安全问题,也简化了变量传递的复杂度。
留言