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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读