福州 网站制作 外贸,网站建设行业 前景,西餐厅网站建设的需求分析,网站除了域名还要什么一、Entry的key为什么要设计成弱引用
1.1、四大引用类型
Java中的四种引用
1.2、Entry源码 1.3、为什么设计为弱引用
1.3.1、官网 To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys。 1.3.2、ThreadLocal引用示意…一、Entry的key为什么要设计成弱引用
1.1、四大引用类型
Java中的四种引用
1.2、Entry源码 1.3、为什么设计为弱引用
1.3.1、官网 To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys。 1.3.2、ThreadLocal引用示意图 再说ThreadLocal的key设计为弱引用之前先来说说如果设计为强引用会有什么问题 key使用强引用假设在业务代码中使用完ThreadLocalThreadLocal中的ref被回收了但是因为ThreadLocalMap的Entry的key强引用了ThreadLocal造成ThreadLocal无法回收在没 有删除这个Entry以及当前线程依然在运行的前提下始终有一条强引用链即Thread refThread objThreadLocalMap objEntryEntry就不会被回收Entry中包括ThreadLocal实例和value导致Entry内存泄漏 key使用弱引用同样假设在业务代码中使用完ThreadLocalThreadLocal ref被回收了由于ThreadLocalMap的Entry的key使用的是弱引用当gc时ThreadLocal obj能够顺利被回收此时Entry中的key为null但是在没有手动删除这个Entry以及当前线程依然在运行的前提下也始终存在着一条强引用链即Thread refThread objThreadLocalMap objEntryvaluevalue不会被回收而这块value永远不会被访问到了导致value内存泄漏 总结既然key设计为强引用和弱引用都有可能出现内存泄漏的问题那么为什么要设计为强引用呢事实上在ThreadLocalMap中的set()、getEntry() 方法中会对key是否为nullkey为ThreadLocal进行判断如果key为null的话那么会对value设置为null这就意味着使用完ThreadLocal当前线程依然运行的前提下就算忘记调用remove()方法了弱引用也比强引用多一层保障所引用的keyThreadLocal会被回收对应的value会在下次ThreadLocalMap中调用set()、getEntry()、remove()中的任一方法时都会被清除从而避免内存泄露。