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

参考
线程封闭

线程封闭

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

实现线程封闭

  • 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();
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容