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对象中,则一个请求结束后必须要清空

    附:

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

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

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

  • 相关阅读:
    《数据结构与算法Python语言描述》习题第二章第三题(python版)
    mysql中的视图
    mysql中列的增删改
    php隐藏WEBSHELL技巧
    php webshell常见函数
    MySQL join 用法
    BurpSuite 设置Hostname Resolution
    Linux mint 18.1 / Ubuntu 16.04 安装steam
    Linux SCIM/fcitx/ibus 输入法
    mysql 复制表结构 / 从结果中导入数据到新表
  • 原文地址:https://www.cnblogs.com/csuliujia/p/12566344.html
Copyright © 2011-2022 走看看