说一下TreadLocal,深拷贝和浅拷, 强引用,软引用,弱引用和虚引用

ThreadLocal是Java提供的线程本地存储,用于线程安全。它通过ThreadLocalMap在每个线程中保存数据,但可能导致内存泄漏,需手动清除。深拷贝和浅拷贝分别涉及对象复制的不同层次,深拷贝保持独立修改,而浅拷贝共享同一内存地址。文章还介绍了不同引用类型,如强引用、软引用、弱引用和虚引用,以及它们对垃圾回收的影响。
摘要由CSDN通过智能技术生成

ThreadLocal 是什么?有哪些使用场景?

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式

  1. ThreadLocal 是java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻,任意方法中获取缓存的数据。
  2. Thread Local 底层是通过ThreadLocalMap来实现的,每个Thread对象中都存在一个ThraedLocalMap,Map的key为ThreadLocal对象,Map的value为所需要缓存的值。
  3. 如果在线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象在使用完之后,应该要把设置的key,value,也就是Entry对象进行回收,但线程池中的线程不会回收,而线程对象是通过强引用指向ThreadLocalMap,ThreadLocalMap也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会被回收,从而出现线程泄露,解决办法是,在使用了ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清除Entry对象。

深拷贝和浅拷贝区别是什么?

  1. 浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())
  2. 深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

强引用,软引用,弱引用和虚引用

不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。

强引用:

强引用类就是指在代码中普遍存在的,类似于Object object = new Object();只要强引用还在,垃圾回收器就永远不会回收被引用的对象,即使发生OOM,如果没有其他引用关系,只要超过了引用的作用于或者显式的将相应引用赋值为null,就可以被垃圾回收器回收掉。

软引用:

软引用是用来描述一些还有用但是非必须的对象。软引用可以让对象豁免一些垃圾回收,只有当JVM内存不足时,才会回收掉软引用指向的对象,JVM会确保抛出OOM之前回收掉软引用指向的对象,如果这次回收后还是没有足够的内存,JVM将会抛出OOM。软引用通常来实现内存敏感的缓存数据,如果还有空闲内存,就可以暂时保留缓存,如果内存不足时,清理掉缓存,这样就 保证了使用缓存的同时不会耗尽内存。使用SoftReference类来实现软引用。

弱引用:

弱引用也是用来描述非必须对象的,但是强度比软引用更弱一些。被软引用关联的对象只能活到下次垃圾收集前。无论当前内存是否充足,都会回收掉弱引用关联的对象。使用WeakReference类来实现弱引用。

虚引用:

虚引用是一种最弱的引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例(获取到的是null)。虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。有人利用幻象引用监控对象的创建和销毁。提供了PhantomReference类来实现虚引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大梦谁先觉i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值