请选择 进入手机版 | 继续访问电脑版

网赚研究院-致富网赚论坛-网赚宝盒-华夏网赚论坛-28网赚-贵族网赚论坛-日付网赚联盟

 找回密码
 立即注册
查看: 62|回复: 0

黄蓉遇难 使用 ThreadLocal如何避免内存泄露? 海外并购

发表于 2020-1-14 23:12 | 620 显示全部楼层 |阅读模式

[复制链接]

2万

主题

4万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
86686
发表于 2020-1-14 23:12 | 显示全部楼层 |阅读模式
这是写在帖子头部的内容
作者:鲁毅
juejin.im/post/5e0d8765f265da5d332cde44
1.ThreadLocal的操纵场景

1.1 场景1

每个线程必要一个独享工具(凡是是工具类,典范必要操纵的类有SimpleDateFormat和Random)
每个Thread内有自己的实例副本,不同享
比方:课本只要一本,一路做笔记有线程平安题目。复印后没有题目,操纵ThradLocal相当于复印了课本。
1.2 场景2

每个线程内必要保存全局变量(例如在阻挡器中获得用户信息),可以让不同方式间接操纵,制止参数转达的贫苦
2.对以上场景的理论

2.1 理论场景1



使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
使用 ThreadLocal如何避免内存泄露?  新闻


由于中国位于东八区,所以时候从1970年1月1日的8点起头盘算的


使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
使用 ThreadLocal如何避免内存泄露?  新闻


多个线程打印自己的时候(假如线程超级多就会发素性能题目),所以要操纵线程池。


使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
使用 ThreadLocal如何避免内存泄露?  新闻


可是操纵线程池时就会发现每个线程都有一个自己的SimpleDateFormat工具,没有必要,所以将SimpleDateFormat声明为静态,保证只要一个


使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
出现了秒数类似的打印结果,这明显是不切确的。
使用 ThreadLocal如何避免内存泄露?  新闻


出现题目标原因起因

使用 ThreadLocal如何避免内存泄露?  新闻


多个线程的task指向了同一个SimpleDateFormat工具,SimpleDateFormat黑白线程平安的。
治理题目标计划

计划1:加锁
格式化代码是在末端一句return dateFormat.format(date);,所以可以为末端一句代码增加synchronized锁


使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
使用 ThreadLocal如何避免内存泄露?  新闻


运转结果中没有发现类似的时候,到达了线程平安的方针
弱点:由于增加了synchronized,所以会保证同一时候只要一条线程可以尝试,这在高并发场景下必定不是一个好的挑选,所以看看其他计划吧。
计划2:操纵ThreadLocal


使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
使用 ThreadLocal如何避免内存泄露?  新闻


操纵了ThreadLocal后差此外线程不会有同享的 SimpleDateFormat 工具,所以也就不会有线程平安题目
2.2 理论场景2

当前用户信息必要被线程内的全数方式同享
计划1:转达参数
使用 ThreadLocal如何避免内存泄露?  新闻


可以将user作为参数在每个方式及第行转达,
弱点:可是这样做会发生代码冗余题目,而且可保护性差。
计划2:操纵Map
对此举行改良的计划是操纵一个Map,在第一个方式中存储信息,后续必要操纵间接get()即可,
使用 ThreadLocal如何避免内存泄露?  新闻


弱点:假如在单线程情况下可以保证平安,可是在多线程情况下是不成以的。假如操纵加锁和ConcurrentHashMap城市发素性能题目。
计划3:操纵ThreadLocal,实现不同方式间的资本同享
操纵 ThreadLocal 可以制止加锁发生的性能题目,也可以制止层层转达参数来实现营业需求,便可以实现不同线程中存储不同信息的要求。
使用 ThreadLocal如何避免内存泄露?  新闻




使用 ThreadLocal如何避免内存泄露?  新闻




运转结果
使用 ThreadLocal如何避免内存泄露?  新闻


3.对ThreadLocal的总结


  • 让某个必要用到的工具实现线程之间的隔离(每个线程都有自己自力的工具)
  • 可以在任何方式中轻松的获得到该工具
  • 按照同享工具天生的机遇挑选操纵initialValue方式还是set方式
  • 工具初始化的机遇由我们控制的时候操纵initialValue 方式
  • 假如工具天生的机遇不由我们控制的时候操纵 set 方式
4.操纵ThreadLocal的优点


  • 到达线程平安的方针
  • 不必要加锁,尝试服从高
  • 加倍节省内存,节省开销
  • 免除传参的烦琐,低落代码耦合度
5.ThreadLocal道理

使用 ThreadLocal如何避免内存泄露?  新闻



  • Thread
  • ThreadLocal
  • ThreadLocalMap
在Thread类内部有有ThreadLocal.ThreadLocalMap threadLocals = null;这个变量,它用于存储ThreadLocal,由于在同一个线程傍边可以有多个ThreadLocal,而且屡次挪用get()所以必要在内部保护一个ThreadLocalMap用来存储多个ThreadLocal
5.1 ThreadLocal关连方式

T initialValue()
该方式用于设备初始值,而且在挪用get()方式时才会被触发,所以是懒加载。
可是假如在get()之进步行了set()操纵,这样就不会挪用initialValue()。
凡是每个线程只能挪用一次本方式,可是挪用了remove()后就能再次挪用


使用 ThreadLocal如何避免内存泄露?  新闻




void set(T t)
为这个线程设备一个新值


使用 ThreadLocal如何避免内存泄露?  新闻




T get()
获得线程对应的value


使用 ThreadLocal如何避免内存泄露?  新闻




void remove()
删除对应这个线程的值
6.ThreadLocal留意点

6.1 内存泄漏

内存泄漏;某个工具不会再被操纵,可是该工具的内存却没法被发出
使用 ThreadLocal如何避免内存泄露?  新闻




使用 ThreadLocal如何避免内存泄露?  新闻




强援用:当内存不够时触发GC,宁愿抛出OOM也不会采取强援用的内存
弱援用:触发GC后便会采取弱援用的内存
一般情况
当Thread运转竣事后,ThreadLocal中的value会被采取,由于没有任何强援用了
非一般情况
当Thread不停在运转始终不竣事,强援用就不会被采取,存在以下挪用链 Thread-->ThreadLocalMap-->Entry(key为null)-->value由于挪用链中的 value 和 Thread 存在强援用,所以value没法被采取,就有大要出现OOM。
JDK的计划已经考虑到了这个题目,所以在set()、remove()、resize()方式中会扫描到key为null的Entry,而且把对应的value设备为null,这样value工具便可以被采取。


使用 ThreadLocal如何避免内存泄露?  新闻




可是只要在挪用set()、remove()、resize()这些方式时才会举行这些操纵,假如没有挪用这些方式而且线程不制止,那末挪用链就会不停存在,所以大要会发生内存泄漏。
6.2 怎样制止内存泄漏(阿里规约)

挪用remove()方式,就会删除对应的Entry工具,可以制止内存泄漏,所以操纵完ThreadLocal后,要挪用remove()方式。


使用 ThreadLocal如何避免内存泄露?  新闻




6.3 ThreadLocal的空指针很是题目



使用 ThreadLocal如何避免内存泄露?  新闻




6.4 空指针很是题目标治理

假如get方式返回值为底子典范,则会报空指针很是,假如是包装典范就不会出错。这是由于底子典范和包装典范存在装箱和拆箱的关系,形成空指针题目标原因起因在于操纵者。
6.5 同享工具题目

假如在每个线程中ThreadLocal.set()进去的工具本来就是多个线程同享的同一工具,比如static工具,那末多个线程挪用ThreadLocal.get()获得的内容还是同一个工具,还是会发生线程平安题目。
6.6 可以倒霉用ThreadLocal就不要强行操纵

假如在使命数很少的时候,在部分方式中建立工具便可以治理题目,这样就不必要操纵ThreadLocal。
6.7 优先操纵框架的支持,而不是自己缔造

例如在Spring框架中,假如可以操纵RequestContextHolder,那末就不必要自己保护ThreadLocal,由于自己大要会忘记挪用remove()方式等,形成内存泄漏。
本文仅为自己进修时记下的笔记,参考自慕课:
https://coding.imooc.com/class/409.html





免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
感激您的阅读
回复

使用道具 举报

0条回复
跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2015 忽悠兄 X3.2 © 2001-2013 Comsenz Inc.

Archiver|手机版|小黑屋| Comsenz Inc.  |网站地图

快速回复 返回顶部 返回列表