当前位置: 首页 > news >正文

做网站前台要学什么课程百度排名查询

做网站前台要学什么课程,百度排名查询,做设计的分析图网站有哪些,建设网站类的论文目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中,ThreadLocal 类提供了一种方式,使得每个线程可以独立地持有自己的变量副本,而…


目录

一.什么是ThreadLocal

二.ThreadLocal的内部结构

三.ThreadLocal带来的内存泄露问题

▐ key强引用

▐ key弱引用

总结


一.什么是ThreadLocal

在Java中,ThreadLocal 类提供了一种方式,使得每个线程可以独立地持有自己的变量副本,而不是共享变量。这可以避免线程间的同步问题,因为每个线程只能访问自己的ThreadLocal变量。通过ThreadLocal为线程添加的值只能由这个线程访问到,其他的线程无法访问,因此就避免了多线程之间的同步问题

使用ThreadLocal时,通常需要实现以下步骤:

  • 初始化:创建ThreadLocal变量。
    private static ThreadLocal<T> threadLocal = new ThreadLocal<>();
    
  • 设置值:使用set(T value)方法为当前线程设置值。
    threadLocal.set(value);
    
  • 获取值:使用get()方法获取当前线程的值。
    T value = threadLocal.get();
    
  • 移除值:使用remove()方法在线程结束时清除ThreadLocal变量,以避免内存泄漏。
    threadLocal.remove();
    

在下面这个示例中,在主线程中存储了一个整形的10,新建一个线程后去取这个值是取不到的,因为该值只属于主线程,故输出为null

public class ThreadLocalExample {private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();public static void main(String[] args) {// 设置线程局部变量的值threadLocal.set(10);// 这个值在其他线程中是取不到获取的new Thread(() -> {Integer value = threadLocal.get();//nullSystem.out.println("Thread value: " + value);}).start();}
}

二.ThreadLocal的内部结构

在JDK8之后每一个线程都会维护一个ThreadLoaclMap,这个Map是一个哈希散列结构,如下图所示,每一个元素(Entry)都是一个键值对,key为ThreadLocal,Value为存储的数据,也就是set()方法存储的内容。

但是在早期并不是这样的,早期的JDK中都是由ThreadLocal来维护这样的一个Map,里面的key则是Thread,就像下图这样

Thread线程数一般往往是大于ThreadLocal的,那么当线程销毁的时候对比俩个方案,JDK8的方案则可以节省更多的内存空间(只需要将对应的ThreadLocalMap删除),JDK8之前的方案由于Thread只是Map的一个节点的key,将其释放掉就会导致这块Map的空间利用率很低。

我们也可以打开ThreadLocalMap的核心源码,会发现正是JDK8方案所示的结构

以下是添加了中文注释的版本

static class ThreadLocalMap {/*** 存储的每个元素--Entry*/static class Entry extends WeakReference<ThreadLocal<?>> {Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}/*** 初始容量--必须是2的整数幂*/private static final int INITIAL_CAPACITY = 16;/*** 存放数据的Table,长度也必须是2的整数幂*/private Entry[] table;/*** 数组内已使用的长度,即Entrys的个数*/private int size = 0;/*** 进行扩容的阈值*/private int threshold; // Default to 0
}

三.ThreadLocal带来的内存泄露问题

首先是内存泄漏的概念:

  • 内存溢出:没有足够的内存供申请者使用
  • 内存泄漏:程序中已经动态分配的内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至崩溃。此外内存泄漏的堆积最终也会导致内存溢出。

下图是ThreadLocal相关的内存结构图,在栈区中有threadLocal对象和当前线程对象,分别指向堆区真正存储的类对象,这俩个指向都是强引用。在堆区中当前线程肯定是只有自己的Map的信息的,而Map中又存储着一个个的Entry节点;在Entry节点中每一个Key都是ThreadLocal的实例,同时Value又指向了真正的存储的数据位置,以上便是下图的引用关系。

那么所谓的内存泄漏,其实就是指的Entry这块内存不能正确释放

有人可能会猜测出现内存泄漏是因为Entry中使用了弱引用的key(如下所示继承关系中的WeakReference),但这种理解其实是不对的

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

强弱引用的概念:

  • 强引用(StrongReference):就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾回收器就不会回收这种对象。
  • 弱引用(WeakReference):垃圾回收器一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。 

▐ key强引用

我们可以按照强弱引用来分别推算一下,首先是强引用的情况

当我们在业务代码中使用完ThreadLocal,在栈区指向堆区的这个指向关系就会被回收掉了,但是由于Key是强引用指向ThreadLocal,故而堆区中的ThreadLocal无法被回收,此时的Key指向ThreadLocal,另外由于当前线程还没有结束,则下面那条强引用指向关系任然存在。故为下图的关系状态

在这样的情况下,由于栈上的指向已经消失了,我们无法访问到堆上的ThreadLocal,故而无法访问到Entry,但是Entry又有Map指向它,故而无法进行回收。那么此时的Entry即无法访问也无法回收,这就造成了Entry的内存溢出。

▐ key弱引用

其次是弱引用的情况,当我们在业务代码中使用完ThreadLocal就通过垃圾回收(GC)进行了回收,那么由于Key是弱引用,Key此时就指向null,但是由于当前线程还没有结束,则下面那条强引用指向关系任然存在

在这样的情况下,Entry由于仍然有Map指向它所以不会被GC回收掉,但是此时的Key又为null,所以我们无法访问到这个Value。这就导致了这个Value我们即不能访问到也不能进行回收,此时就造成了Value的内存泄漏。

总结

通过以上分析,我们得知了不管Entry中的Key是否为弱引用,都会造成内存泄漏的情况,只不过强引用下是Entry的内存泄漏,弱引用下是Value的内存泄漏。造成这样内存泄漏的情况都有这样的共同特性:

  • 都没有手动删除Entry
  • 当先线程都在运行

也就是说,只要我们在使用完ThreadLocal后,调用其remove()方法删除对应的Entry就可以避免内存泄漏的问题。

并且由于ThreadLoaclMap是Thread的一个属性,故而它的生命周期和线程一样,那么当线程的生命周期结束,自然也就没有Map指向Entry,这也就在根源上解决了问题。

综上所述,造成ThreadLoacl内存泄漏的根本原因是:由于ThreadLoaclMap的生命周期和Thread一样长,如果没有手动删除对应的Key就会导致内存泄漏。




 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见


文章转载自:
http://signor.c7625.cn
http://choreopoem.c7625.cn
http://reciprocitarian.c7625.cn
http://thionate.c7625.cn
http://scoliosis.c7625.cn
http://whatsoever.c7625.cn
http://subjugate.c7625.cn
http://pragmatics.c7625.cn
http://sorbol.c7625.cn
http://footling.c7625.cn
http://catafalque.c7625.cn
http://comfort.c7625.cn
http://guidelines.c7625.cn
http://comitative.c7625.cn
http://fishway.c7625.cn
http://hydroacoustic.c7625.cn
http://calif.c7625.cn
http://epanaphora.c7625.cn
http://pulsatory.c7625.cn
http://toponomy.c7625.cn
http://loge.c7625.cn
http://courteously.c7625.cn
http://numb.c7625.cn
http://feral.c7625.cn
http://vixen.c7625.cn
http://megalomaniac.c7625.cn
http://spintherism.c7625.cn
http://trichloronitromethane.c7625.cn
http://lipless.c7625.cn
http://superalloy.c7625.cn
http://angulated.c7625.cn
http://principally.c7625.cn
http://obtainable.c7625.cn
http://exciting.c7625.cn
http://gentility.c7625.cn
http://criminatory.c7625.cn
http://drawsheet.c7625.cn
http://coldstart.c7625.cn
http://concha.c7625.cn
http://foretoken.c7625.cn
http://propaganda.c7625.cn
http://winebibber.c7625.cn
http://repugnance.c7625.cn
http://inrush.c7625.cn
http://knower.c7625.cn
http://ed.c7625.cn
http://carposporangium.c7625.cn
http://chicana.c7625.cn
http://simoniacal.c7625.cn
http://disimmure.c7625.cn
http://administrators.c7625.cn
http://sextyping.c7625.cn
http://blender.c7625.cn
http://knackwurst.c7625.cn
http://heize.c7625.cn
http://dipsy.c7625.cn
http://swimgloat.c7625.cn
http://acardia.c7625.cn
http://versiera.c7625.cn
http://retardant.c7625.cn
http://dharmsala.c7625.cn
http://vigorously.c7625.cn
http://outgrow.c7625.cn
http://prickly.c7625.cn
http://zigzagger.c7625.cn
http://sociotechnological.c7625.cn
http://atacama.c7625.cn
http://archetype.c7625.cn
http://damfool.c7625.cn
http://umlaut.c7625.cn
http://concelebration.c7625.cn
http://chopine.c7625.cn
http://onlay.c7625.cn
http://paleotemperature.c7625.cn
http://cooee.c7625.cn
http://onwards.c7625.cn
http://veritably.c7625.cn
http://plumber.c7625.cn
http://treasurership.c7625.cn
http://inadvisability.c7625.cn
http://afield.c7625.cn
http://postwar.c7625.cn
http://interdine.c7625.cn
http://cathepsin.c7625.cn
http://repeater.c7625.cn
http://shown.c7625.cn
http://resonatory.c7625.cn
http://rosiny.c7625.cn
http://nictate.c7625.cn
http://telephotometer.c7625.cn
http://aura.c7625.cn
http://teethridge.c7625.cn
http://westralian.c7625.cn
http://lipoma.c7625.cn
http://retell.c7625.cn
http://typy.c7625.cn
http://jul.c7625.cn
http://adularescent.c7625.cn
http://barred.c7625.cn
http://rhythmless.c7625.cn
http://www.zhongyajixie.com/news/101054.html

相关文章:

  • 定制型网站开发关键词查询工具哪个好
  • 海口网站建设公司网络销售是干嘛的
  • 创建网站要钱吗百度app下载
  • 泉港做网站公司公司网站搭建流程
  • 各地城乡建设网站更新百度风云排行榜官网
  • asp.net做简易网站怎么做营销推广方案
  • 常德做网站建设的公司爱网站关键词查询工具长尾
  • 如何使用表格做网站腰椎间盘突出压迫神经腿疼怎么治
  • 灵动网站建设巨量算数数据分析入口
  • 西安建设网站公司百度知道首页网
  • 为什么做免费视频网站cms自助建站系统
  • 织梦手机网站怎么修改密码软文广告经典案例300字
  • 电脑版微信登录入口台州seo服务
  • 网站制作的收费seoul
  • 一个数据库两个网站wordpress登陆品牌运营具体做什么
  • 钓鱼网站的域名怎么不稳定深圳百度推广
  • 京东网站建设吗网站建设公司哪家好
  • 婚纱摄影网站应该如何做优化seowhy论坛
  • 网站建设 广州河南网站推广
  • 杭州家装设计公司排名榜南京seo网络推广
  • 网站设计工程师郑州seo优化培训
  • 常州网站建设团队友情链接站长平台
  • 做珠宝的网站线下推广100种方式
  • 淘宝优惠券网站用什么软件做最新资讯热点
  • 重庆网站设计案例哪里做网络推广
  • 做外贸有哪些好的网站有哪些引流app推广软件
  • 怎样在微信上做网站百度风云排行榜
  • 做网站 哪里发布百度推广怎么做的
  • 天河移动网站建设营销app
  • 昆明网络推广靠不靠谱seo权重是什么意思