Java中的四种引用类型

Java中的四种引用类型

Java中的变量有两种数据类型,分别是基本数据类型和引用数据类型,这篇文章就来讲一下Java中的引用类型。Java为引用类型专门定义了一个类叫做Reference。而引用类型Reference跟Java垃圾回收机制息息相关,所以我们有必要理解四种引用类型,才可以更加深入的理解Java的垃圾回收是怎么工作的。

一、强引用:

Java中默认的引用就是强引用,任何一个对象的赋值操作就产生了对这个对象的强引用。例如

Object o = new Object(); 
// 我们创建了一个Object对象,并复制给了o,这时o就是Object对象的一个强引用。

强引用的对象在发生GC时不会被回收。

二、软引用:

有用但不是必须的对象,发生GC时不一定会回收该对象,只有在内存不够用时才会被回收。软引用适合缓存使用的场景。下面看一下软引用对应的类SoftReference:

// 继承Reference抽象类
public class SoftReference<T> extends Reference<T> {
    // 有两个构造方法
    /**
     * @param referent 软引用的对象
     */
    public SoftReference(T referent) {
        super(referent);
        /*
           timestamp:记录每次调用get()方法获取软引用对象时的时间戳,虚拟机在清除
           软引用时可能会用到。
        */
        this.timestamp = clock; 
    }
    /**
     * @param referent 软引用的对象
     * @param ReferenceQueue 存储待回收的引用对象,也就是Reference的实例对象。
        软引用自身需要配合引用队列来释放。
     */
    public SoftReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
        this.timestamp = clock;
    }
}

例子:

SoftReference<Object> soft = new SoftReference<>(new Object());
// 当内存不足时Object对象就会被回收

三、 弱引用:

有用但不是必须的对象,在每次 GC 时都会被回收,这是和软引用的主要区别。下面看一下弱引用对应的类WeakReference:

// 同样继承Reference抽象类,构造方法也和SoftReference类似
public class WeakReference<T> extends Reference<T> {
    
    public WeakReference(T referent) {
        super(referent);
    }
    public WeakReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
    
}

四、虚引用(幽灵引用/幻影引用):

无法通过虚引用获得对象,虚引用的用途是在GC时返回一个通知,即在GC的过程中,如果发现有PhantomReference,GC则会将引用放到ReferenceQueue中,程序员可通过ReferenceQueue知道发生了GC。下面看一下虚引用对应的类PhantomReference:

public class PhantomReference<T> extends Reference<T> {
        // 虚引用对象只有一个构造函数,必须传入ReferenceQueue
     public PhantomReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JavaLearn-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值