ThreadLocal是为了避免共享, 避免锁竞争, 使用了空间换时间的思路
若使用Map, Thread做Key, 则回到了问题本身, 仍会发生锁竞争, 降低效率
所以数据实际上是存储在java.lang.Thread#threadLocals
的 ThreadLocal相当于一个钥匙/桥梁去访问Thread内的数据
Q1: 为什么ThreadLocalmap中Entry的Key (ThreadLocal) 要设置成弱引用
如果ThreadLocal使用完了, 但是Entry的key仍引用着该对象, 会造成内存泄漏
Q2: 为什么ThreadLocalmap中Entry的Value (实际存储的对象) 不设置成弱引用
如果发生GC就将该对象回收, 那么会造成系统异常, 用户仍然可能使用这个值
如果key (ThreadLocal) 被回收了, value仍然存在, 就会造成内存泄漏, 所以需要每次使用完成后手动调用remove
ThreadLocal也会在查找Entry或Map扩容的时候清除无用的Entry (Key为null), 一定程度上避免内存泄漏
父子线程中如何共享数据 Thread内Thread#inheritableThreadLocals
ref https://www.51cto.com/article/679528.html
原文地址:https://cloud.tencent.com/developer/article/2185586
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。