首页 > 其他分享 >ThreadLocal(待补充)

ThreadLocal(待补充)

时间:2023-04-16 23:33:05浏览次数:28  
标签:value 补充 回收 -- ThreadLocal 线程 引用

ThreadLocal的结构

每个线程对象都有一个ThreadLocal.ThreadMap维护了一个ThreadMap;ThreadMap维护了Entry结构的一个数组对象。

  static class Entry extends WeakReference<ThreadLocal<?>> {
          /** The value associated with this ThreadLocal. */
          Object value;

          Entry(ThreadLocal<?> k, Object v) {
              super(k);
              value = v;
          }
      }

 

ThreadLocal为什么会出现内存溢出的问题

ThreadLocal的key是一个软引用对象。

  • 软引用对象是当发生gc的时候,软引用对象,如果在gc的时候并且没有被引用了,就会被进行回收。如果当前线程ThreadLocal没有被引用了,当gc的时候,就会被回收掉key,但是当前线程还存在着对value的强引用一直无法被回收掉,所以就造成了oom

  • Current Thread Reference --> Current Thread --> ThreadLocalMap --> EntryValue --> Object

 

ThreadLocal为什么要将key设置为弱引用有什么好处

设置为弱引用,gc回收的时候会被回收掉,但是key为null,value不为null的对象没办法被回收掉。所以在ThreadLocal的时候的set,get,remove的时候会回收掉key为value的对象。

  • 如果设置为强引用的话,使用这些方法是没办法进行回收掉的。 分配了ThreadLocal对象,但是并没有执行其get、set、remove方法,导致不能有效的清除null对象;

  • 使用线程池的情况下,使用完ThreadLocal一定要使用remove方法即时清理,因为ThreadLocal是属于某个线程的,而在使用线程池的情况下,这些线程都是可重复利用、存活时间长的线程,如果在使用过程中不仅从即使的remove,那么不仅会造成内存泄露的问题,还会引发一些功能逻辑问题,比如,B请求可能和A请求分配到了线程池中的同一个线程,那么它们拿到的ThreadLocal就是一样的。

为什么value也不设置为弱引用

 

父子线程如何共享变量--InheritableThreadLocal

标签:value,补充,回收,--,ThreadLocal,线程,引用
From: https://www.cnblogs.com/xiaolianya/p/17322152.html

相关文章

  • 使用ThreadLocal请务必remove
    原文地址:https://www.cnblogs.com/panchanggui/p/15105419.html特别注意,web容器的线程是重复使用的,web容器使用了线程池,当一个请求使用完某个线程,该线程会放回线程池被其它请求使用,这就导致一个问题,不同的请求还是有可能会使用到同一个线程(只要请求数量大于线程数量),而ThreadLocal......
  • ThreadLocal 简单介绍
    目录一、什么是ThreadLocal?二、ThreadLocal如何使用?三、ThreadLocal的实现原理是什么?1、set()方法2、ThreadLocalMap3、get()方法4、remove()方法5、总结四、ThreadLocal数据共享五、ThreadLocal在Java中的应用场景有哪些?六、常见问题1、Entry的key为什么设计成弱引用?2、ThreadLo......
  • K8S-StorageClass资源-实践【补充知识点】
    Kubernetes学习目录1、准备工作1.1、官方文档支持的存储制备器:https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#provisionerNFSprovisioner:https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#nfs1.2、nfs-subdir-external-pro......
  • ThreadLocal
    ThreadLocal介绍ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来......
  • Java中ThreadLocal的用法和原理
    用法隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。packagecom.example.test1.service;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Component;imp......
  • ThreadLocal原理探究
    四大引用是什么,分别有什么特点:1强引用、软引用、弱引用、虚引用强引用:发生gc的时候,只要对象还有引用,就不会被回收软引用:发生gc的时候,内存够用就不会回收,内存不够时,就会回收。可以及时的避免oom。Map<String,SoftReference<BitMap>>imageCache=newHashMap<Str......
  • 重要理论补充说明
    目录全文检索插入数据更新数据删除数据主键外键重命名表事务安全管理隔离级别锁事务日志MVCC多版本控制转换表的引擎全文检索MySQL的全文检索功能MYISAM存储引擎支持而InnoDB存储引擎不支持一般在创建表的时候启用全文检索功能createtablet1( idintprimarykeyauto_incr......
  • ThreadLocal
    什么是ThreadLocalThreadLocal提供了线程局部变量.这些变量和正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候都有自己独立的变量副本.ThreadLocal实例通常是类的私有静态字段,使用它的目的是希望将状态(用户ID、事务ID)与线程关联起来通俗易懂:实现每一个线......
  • 博弈补充练习
    NimornotNim类似于NIM游戏,有\(n\)堆石子,不过每个回合玩家可以从某个堆中删除任意数量的对象,也可以将堆分成两个较小的石堆,拿走最后一个石子的人获胜。还是一个裸的求sg函数的题,但由于范围过大,肯定不能每次来求sg函数值。于是需要打表。发现当\(x%4==0\)时,sg(......
  • 【Git分布式版本控制工具-补充&新增IDEA操作】
    本文纲要一、Git常用命令1、Git全局设置【补充】2、获取Git仓库3、本地仓库操作4、远程仓库操作5、分支操作6、标签操作【补充】二、在IDEA中使用Git【新增】1、在IDEA中配置Git2、Git仓库操作3、.gitignore文件4、本地仓库操作5、远程仓库操作6、分支操作一、Git常用......