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

    附:

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

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

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

  • 相关阅读:
    struts2文件上传(多文件)文件下载
    Struts2拦截器
    MySQL中修改多个数据表的字段拼接问题
    Struts2接受请求参数三种常用方法
    struts2 配置详解
    Struts2入门问题
    Struts2启动问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    Ajax和json一道基本的练习题
    jQuery事件--blur()和focus()
    jQuery事件--mouseover()、mouseout()、mouseenter()和mouseleave()
  • 原文地址:https://www.cnblogs.com/csuliujia/p/12566344.html
Copyright © 2011-2022 走看看