美文网首页
ThreadLocal典型使用场景二

ThreadLocal典型使用场景二

作者: wbpailxt | 来源:发表于2020-03-11 10:00 被阅读0次

    假设现在需要每个线程保存全局变量,可以让不同方法直接使用。


    全局变量作为参数层层传递

    用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;
        }
    }
    

    相关文章

      网友评论

          本文标题:ThreadLocal典型使用场景二

          本文链接:https://www.haomeiwen.com/subject/zeyfjhtx.html