ThreadLocal典型使用场景二
2020-03-11 本文已影响0人
wbpailxt
假设现在需要每个线程保存全局变量,可以让不同方法直接使用。
全局变量作为参数层层传递
用map来解决
线程作为key,业务信息作为value
可以用static的ConcurrentHashMap,把当前线程的ID作为key,把user作为value来保存,这样可以做到线程间的隔离,但是依然有性能影响。
更好的办法是使用ThreadLocal来解决,这样无需Synchronized,可以在不影响性能的情况下,也无需参数层层传递,就可达到保存当前线程对应的用户信息的目的。
用ThreadLocal保存业务信息,这些信息在同一个线程内相同,但是不同的线程使用的业务信息是不同相同的。
threadlocal典型使用场景2.jpg
/**
* 描述: 演示ThreadLocal用法2:避免传递参数的麻烦
*/
public class ThreadLocalNormalUsage06 {
public static void main(String[] args) {
new Service1().process("");
}
}
class Service1 {
// 假设下面方法是一个拦截器
public void process(String name) {
User user = new User("超哥");
UserContextHolder.holder.set(user);
new Service2().process();
}
}
class Service2 {
//假设下面方法是拦截器之后进入的controller,不需要传参,直接从当前线程的ThreadLocalMap中取。
public void process() {
User user = UserContextHolder.holder.get();
//ThreadSafeFormatter.dateFormatThreadLocal.get();
System.out.println("Service2拿到用户名:" + user.name);
new Service3().process();
}
}
class Service3 {
//假设下面方式controller之后的service层,同理。
public void process() {
User user = UserContextHolder.holder.get();
System.out.println("Service3拿到用户名:" + user.name);
UserContextHolder.holder.remove();
}
}
class UserContextHolder {
public static ThreadLocal<User> holder = new ThreadLocal<>();
}
class User {
String name;
public User(String name) {
this.name = name;
}
}