网站淘宝客 没备案怎么做,潍坊 网站建设,锦州电脑网站建设,成免费的crmThreadLocal 是 Java 中实现线程封闭#xff08;Thread Confinement#xff09;的核心机制#xff0c;它通过为每个线程创建变量的独立副本来解决多线程环境下的线程安全问题。
Thread
└── ThreadLocalMap (threadLocals) // 每个线程持有的专属Map├── Entry[] tab…ThreadLocal 是 Java 中实现线程封闭Thread Confinement的核心机制它通过为每个线程创建变量的独立副本来解决多线程环境下的线程安全问题。
Thread
└── ThreadLocalMap (threadLocals) // 每个线程持有的专属Map├── Entry[] table // 哈希表结构│ └── Entry extends WeakReferenceThreadLocal?│ ├── ThreadLocal? key // 弱引用Key│ └── Object value // 强引用Value└── 其他HashMap类似字段
threadlocal里的数据是怎么存储的 每个线程内部有一个专属、私有的ThreadLocalMap就是一个hashMap底层用Entry数组存数据
value要保存的资源
调用set方法时就是以当前ThreadLocal对象为key以资源为value放到ThreadLocalMap中
调用get方法时就是以当前ThreadLocal对象为key从ThreadLocalMap中取value
开发中一般把ThreadLocal声明为static这样ThreadLocal对象是线程共享的那key都共享了不同线程取出来的value不就是同一个吗
并不是。ThreadLocalMap是每个线程私有的
[正确模型]
static ThreadLocal实例作为Key
├── 线程1的ThreadLocalMap: Entry(KeyThreadLocal实例 → ValueA)
├── 线程2的ThreadLocalMap: Entry(KeyThreadLocal实例 → ValueB)
└── 线程3的ThreadLocalMap: Entry(KeyThreadLocal实例 → ValueC)
为什么key是弱应用
要避免key的内存泄露问题
情况1new Thread()的情况用完正常销毁那么ThreadLocalMap会被GC正常回收不会出现内存泄露。
情况2使用线程池结合ThreadLocal的情况这个使用更常见不需要频繁创建可以复用线程池中的线程不会销毁会一致复用。 弱引用KeyGC时ThreadLocal无强引用回收Key防止Map持续增长
key只有弱引用时只要发生了垃圾回收ThreadLocalMap就会回收避免内存泄露问题 ThreadLocalMap中如何清理大量为null的数据
在调用set、get、remove方法时就会遍历数组清除为null的entry然后通过线性探测重新处理hash冲突
为什么value是强引用
将数据存到value中是为了要用它如果不是强引用就会被GC回收 那value怎么回收呢
不回收会导致内存泄露 所以在使用完ThreadLocal后必须断开强引用即调用remove方法手动断开强引用让gc把它回收了