谈谈ThreadLocal是怎么解决并发安全的?
ThreadLocal是Java提供的一种保存线程私有信息的机制,因为其在整个线程生命周期内有效,所以可以方便的在一个线程关联的不同业务模块之间传递信息,比如事务ID、Cookie等上下文相关信息。
ThreadLocal为每一个线程维护变量的副本,把共享数据的可见范围限制在同一个线程之内,实现原理是:在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。
使用案例:
JUC——ThreadLocal 实现全局获取用户信息_threadloacl获取账号数据-CSDN博客
为什么会说慎用ThreadLocal,谈谈理解和使用注意事项?
使用ThreadLocal要注意remove
ThreadLocal的实现是基于ThreadLocalMap,在ThreadLocalMap中,它的key是一个弱引用。
通常弱引用都会和引用队列配合清理机制使用,但是ThreadLocal是个例外,没有这么做。这意味着,废弃项目的回收依赖于显式的触发,否则就要等待线程结束,进而回收相应的ThreadLocalMap,这就是狠多OOM的来源,所以通常都会建议,应用一定要自己负责remove。并且不要和线程池配合,因为worker线程往往是不会退出的