美文网首页
线程安全策略(二)——线程封闭

线程安全策略(二)——线程封闭

作者: 墨平语凡 | 来源:发表于2018-06-03 09:56 被阅读0次

    参考
    线程封闭

    线程封闭

    把对象封装到一个线程里,只有这一个线程能看到这个对象(即使这个对象不是线程安全的也不会出现任何线程安全的问题了,因为只能在一个线程里访问)

    实现线程封闭

    • Ad-hoc 线程封闭:程序控制实现,最糟糕,忽略
    • 堆栈封闭:局部变量,无并发问题(简单来说就是局部变量,比如多个线程访问一个方法,方法中的局部变量都会被拷贝到线程的栈中,所以局部变量不会被多个线程共享,也就不会出现并发问题,全局变量才容易出现问题)
    • ThreadLocal 线程封闭:特别好的封闭方法(ThreadLocal内部维护了一个Map, Map的key是每个线程的名称,Map的值是要封闭的对象,每个线程的对象都对应了Map的值)

    ThreadLocal 实例保存登录用户信息

    public class RequestHolder {
        private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();
    
        /**
         * 添加数据
         * 在filter里将登录用户信息存入ThreadLocal
         * 如果不使用ThreadLocal,我们会需要将request一直透传
         * @param id
         */
        public static void add(Long id){
            // ThreadLocal 内部维护一个map,key为当前线程名,value为当前set的变量
            requestHolder.set(id);
        }
    
        /**
         * 获取数据
         * @return
         */
        public static Long getId(){
            return requestHolder.get();
        }
    
        /**
         * 移除变量信息
         * 如果不移除,那么变量不会释放掉,会造成内存泄漏
         * 在接口处理完以后进行处理(interceptor)
         */
        public static void remove(){
            requestHolder.remove();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:线程安全策略(二)——线程封闭

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