java进阶:强引用到底如何实操?

这篇文章我们来了解下 Java 的引用方式,分为 4 种,强引用、软引用、弱引用和虚引用,Java 引入这 4 种引用方式,目的是程序通过编程形式决定对象的存活生命周期。

强引用

强引用这是最常见的引用类型。

//通过new关键字创建一个Dog对象
Dog dog = new Dog();
//通过对象来设置名字name
dog.setName(“小黑”);
dog.setColor(“黑色”);
存储示意图如下:

图片

引用变量 dog 存储在栈内存中,指向的是一个引用地址,这个和数组、C语言的指针很类似,真正的 Dog 对象存储在堆内存中。

代码创建一个 dog 对象,同时进行 name、color 属性赋值。此时 dog 就是一个强引用,只要强引用存在,垃圾回收不会回收这个对象。

当程序执行以下代码时

//dog 对象赋值为 null
dog = null ;
存储示意图

dog 对象失去了引用,垃圾回收器会进行标记,进行回收。

软引用

软引用是通过类 SoftReference 来实现的。当年内存资源不足时,垃圾回收器可能回收软引用关联的对象。

SoftReference softRef = new SoftReference(“Hello World!”);

弱引用

弱引用通过类 WeakReference来实现。弱引用比软引用的优先级更低,无论当前内存空间足够与否,垃圾回收器都会回收弱引用关联的对象。

WeakReference weakRef = new WeakReference(“Hello World!”);
ThreadLocal 类的源代码里面 涉及到 WeakReference。 ThreadLocal可以将一些需要在多个线程间共享的数据保存在每个线程自己的内存空间里,每个线程都可以独立地访问自己的数据副本,避免了线程间的竞争条件。

为了方便垃圾回收,Entry 继承了 WeakReference 。

static class Entry extends WeakReference> {
/** The value associated with this ThreadLocal. */
Object value;

Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
考虑到此文章主要讲解 Java 引用方式,ThreadLocal 类暂不展开来讲。

虚引用

虚引用通过类 PhantomReference 来实现的。虚引用可以理解为没有引用,需引用搭配 引用队列 ReferenceQueue 来使用。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

Java 强引用使用场景多,其他引用方式做一个了解。

你可能感兴趣的:(徐浪老师大讲堂,java,python,jvm)