ThreadLocal——简单使用
ThreadLocal定义
ThreadLocal 它为每个使用该变量的线程都提供了一个独立的副本,从而每个线程都可以独立地读取、修改自己的副本,从而实现线程级别的数据隔离。适用于在多线程环境下,各线程需要拥有独立变量副本场景。
ThreadLocal使用场景和使用方法
使用场景主要分为两种
一是将线程不安全的工具类,通过ThreadLocal的形式,转变为线程安全的工具类,在线程中使用,如SimpleDateFormat类。
二是定义线程独立的变量副本,实现线程级别的隔离。如不同线程能读取不同的用户信息,不同线程能读取不同的数据库连接池。
使用方法
在第一种场景下(以SimpleDateFormat为例):
- 可以定义一个新工具类,创建一个新的ThreadLocal对象,并重写initialValue 方法;
- 设置响应的方法,通过get()方法获取ThreadLocal变量副本
代码示例:
public class DateUtils {
public static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
public static Date parseDate(String stringDate) throws Exception {
return threadLocal.get().parse(stringDate);
}
}
在第二种场景下(以获取用户信息为例):
创建一个新的ThreadLocal对象,通过set()方法,将用户信息放入ThreadLocal变量副本,然后通过get()方法,获取对应的用户信息。通过remove()方法,清除ThreadLocal变量。
代码示例:
public class FeginUser{
public static final ThreadLocal<User> threadLocal = new ThreadLocal<User>();
public static void setUser(User user){
threadLocal.set(user);
}
public static User getUser(){
return threadLocal.get();
}
}