zoukankan      html  css  js  c++  java
  • threadLocalMap理解

    threadLocal和threadLocalMap

    用途:放入到threadlocalMap对象中,同一个线程thread在任何地方都可以拿出来

    理解(参考源码):

    每个线程thead对象具有一个自己的threadLocalMap对象

    threadLocalMap类的定义在threadLocal类中,是threadLocal类的静态内部类,属于threadLocal类,而不是属于threadLocal对象

    在threadLocal类中的方法创建threadLoalMap对象,赋予给thread对象(若thread对象中已有threadLocalMap对象,则直接取即可)

    threadLocalMap对象的元素entry的key是threadLocal对象,value是需要存储的数据,可以具有多个threadLocal对象(多个不同key)及对应的value数据

    entry的key是一个弱引用的ThreadLocal对象(弱引用对象存活到下一次垃圾回收发生前),所以垃圾回收之前会清除entry对象的key,则会出现key为null的entry,但value所占内存不会释放,则可能会出现内存泄露(无法释放已申请的内存空间),最终导致内存溢出(没有内存可以分配给新的对象)。在ThreadLocal类的get()、set()、remove()方法,均有实现回收 key 为 null 的 Entry 的 value所占的内存。所以为了防止内存泄露,当线程任务不会再用ThreadLocal对象的末尾,调用一次上述三个方法的其中一个即可。个人理解其实线程死亡时会回收所有内存。

    //注意,在web中,由于tomcat线程重用,如果用户信息存在threadLocalMap对象中,则一个请求结束后必须要清空

    附:

    强引用: 不会被回收的内存。

    软引用: 内部不足的时候回收的内存。

    弱引用: 存活到垃圾回收前的内存。

  • 相关阅读:
    排序
    阿里实习 电面,面试
    外部排序
    error: LNK 2019 无法解析的外部符号
    c++ 变量定义 的初始化规则
    Spring 让 LOB 数据操作变得简单易行
    深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
    Spring jdbc call oralce procedure or function
    JSON 简单封装
    extjs3 用户管理 页面
  • 原文地址:https://www.cnblogs.com/csuliujia/p/12566344.html
Copyright © 2011-2022 走看看