java引用类型有啥_ThreadLocal:我理解的java四种引用类型

推荐阅读:

  1. 秋招面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等
  2. 面试BAT 却被小小字符串秒杀?这13道题帮你一举击败字符串算法题
  3. 面试败给Redis?一次性给你总结:高频面试+学习笔记+思维导图等

01 前言

为了理解ThreadLocal,掌握引用的概念是非常有必要的。

efe97349fe97ef3f04f3acaf2c01e1ae.png

02 引用与对象

java中我们通过一个引用指向内存中对象。

//创建一个引用,引用可以独立存在,并不一定需要与一个对象关联User user;user = new User();

user是引用, 通过‘=’指向了内存中的对象。

03 四种引用

JDK1.2后,根据对对象的引用强度不同,将引用分为4种类型。

(1)强引用:

平时使用最多,最普遍的引用。

User user;user = new User();//强引用
  • user就是强引用
  • 堆中的User对象实例,就是“被应用”;

只要user 指向 User对象。User对象就不会被回收。

user = null;断开了引用,User对象不可达,会被回收。

(2)软引用:

我们可以通过SoftReference来定义一个软引用

SoftReference softRef=new SoftReference(new User());//软引用
  • 如果一个对象只有软引用,内存足够时,GC时不回收他。如果内容空间不足时,就会回收被软引用指向的对象内存。
  • 只要没有别回收,还可以使用

解释下:对象只有软引用 对象有两种引用的情况

User user = new User();//强引用SoftReference softRef=new SoftReference(user);//软引用

对象只有软引用情况

SoftReference softRef=new SoftReference(new User());//软引用

User user = new User();//强引用SoftReference softRef=new SoftReference(user);//软引用user = null;//断开了强引用。 此时只有软引用。

软引用可与引用队列(ReferenceQueue)联合使用,在创建软引用时,关联ReferenceQueue。如果软引用引用的对象被回收时,Java虚拟机会把这个软引用加入到与之关联的引用队列中。

软引用可用作内存敏感的高速缓存。

(3)弱引用:

可以通过WeakReference来定义一个弱引用

WeakReference<> weak = new WeakReference<>(new User());//定义一个软引用指向堆内User对象
  • 如果对象只有弱引用,GC时,不管内存是否足够。都会回收,弱引用指向的对象。

弱引用也可与引用队列(ReferenceQueue)联合使用,在创建弱引用时,关联ReferenceQueue。如果弱引用引用的对象被回收时,Java虚拟机会把这个弱引用加入到与之关联的引用队列中。

ThreadLocal 中使用到了弱引用。

(4)虚引用:

虚引用是最弱的引用,弱到,不能用弱引用访问到对象。

可以通过PhantomReference来定义一个虚引用。

虚引用,主要用来跟踪对象被垃圾回收器回收的活动。

虚引用必须与引用队列(ReferenceQueue)一起使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。我们可以根据引用是否在队列中,来判断对象的回收活动。

(5)为什么需要不同的引用类型

我们看出引用强度的不同,对象的生命周期不同,垃圾回收策略丰富,有利于更好的管理对象内存。


04 总结:

  • 引用与对象的生命周期相关。
  • 对象可以被多种类型的,多个引用指向,但只要有一个强引用。垃圾回收器不回收。

关键时理解: 一个对象,可以被多种类型引用同时指向,强度最高的决定他的生命周期

注意:这里的内存应该是指“堆内存”,并且区分引用类型基本类型

//String user ="user";//String user = new String("user");SoftReference softRef=new SoftReference(user);WeakReference weak = new WeakReference(user);user=null;System.out.println(softRef.get());System.gc();System.out.println(weak.get());


作者:wuqinduo
原文链接:https://juejin.im/post/5dc3700ef265da4d270b4864

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值