thinking in java 之Reference类的使用

Reference是java中的特殊引用类。描述的是特殊作用(主要是关于垃圾回收对象)的引用。

它有3个子类:

1.SoftReference;

2.WeakReference

3.PhantomReference

先看thinking in java 中的实例

package containers;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.LinkedList;

//对引用的 描述与封装,Reference类

class VeryBig2{
    private static final int SIZE= 10000;
    private long[] la= new long[SIZE];
    private String ident;
    public VeryBig2(String id){
        ident= id;
    }
    @Override
    public String toString() {

        return ident;
    }
    protected void finalize(){
        System.out.println("Finalizing "+ ident);
    }
}

public class ReferencesTest {
    private static ReferenceQueue<VeryBig2> rq=
            new ReferenceQueue<VeryBig2>();
    public static void checkQueue(){
        Reference<? extends VeryBig2> inq= rq.poll();
        if (inq != null) {
            System.out.println("In queue: "+ inq.get());
        }
    }

    public static void main(String[] args) {
        int size= 10;
        if (args.length> 0) {
            size= new Integer(args[0]);
        }
        LinkedList<SoftReference<VeryBig2>> sa=
                new LinkedList<SoftReference<VeryBig2>>();
        for (int i = 0; i < size; i++) {
            sa.add(new SoftReference<VeryBig2>(new VeryBig2("Soft "+ i), rq));
            System.out.println("Just created: "+ sa.getLast());
            checkQueue();
        }

        LinkedList<WeakReference<VeryBig2>> wa=
                new LinkedList<WeakReference<VeryBig2>>();
        for (int i = 0; i < size; i++) {
            wa.add(new WeakReference<VeryBig2>(new VeryBig2("Weak "+ i), rq));
            System.out.println("Just created: "+ wa.getLast());
            checkQueue();
        }

        SoftReference<VeryBig2> s=
                new SoftReference<VeryBig2>(new VeryBig2("Soft"));
        WeakReference<VeryBig2> w=
                new WeakReference<VeryBig2>(new VeryBig2("Weak"));
        System.gc();//对无引用的对象,执行垃圾回收操作。并且,调用回收对象的finalize方法

        LinkedList<PhantomReference<VeryBig2>> pa=
                new LinkedList<PhantomReference<VeryBig2>>();
        for (int i = 0; i < size; i++) {
            pa.add(new PhantomReference<VeryBig2>(new VeryBig2("Phantom "+ i), rq));
            System.out.println("Just created: "+ pa.getLast());
            checkQueue();
        }
    }
}

output:

Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: java.lang.ref.Sof[email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Finalizing Weak
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Finalizing Weak 9
Just created: [email protected]
In queue: null
Finalizing Weak 8
Finalizing Weak 7
Just created: [email protected]
In queue: null
Finalizing Weak 6
Finalizing Weak 5
Finalizing Weak 4
Finalizing Weak 3

从结果中,可以看出:

1.垃圾回收器回收优先级别:SoftReference< WeakReference < PhantomReference。

2.当运行垃圾回收方法System.gc时,会先调用目标对象的finalize方法。

3.

时间: 2024-12-29 09:11:57

thinking in java 之Reference类的使用的相关文章

java &nbsp; net --------------------------------URL类

java   net ---------------------------URL类 package java_net; import java.net.MalformedURLException; import java.net.URL; /*  * 测试URL类  */ public class URL_Test {  public static void main(String[] args) { try { //我们需要构造一个URL对象,构造方法有很多种 /*  * 1.通过一个字符串

Java Objects-------------工具类使用

Java  Objects-------------工具类使用 1.Objects类简介: public final class Objectsextends Object This class consists of static utility methods for operating on objects. These utilities include null-safe or null-tolerant methods for computing the hash code of a

java的Reference学习

java中Reference学习 谈到Reference想到了什么 Reference提供了一种与jvm gc交互的一种方式,提到Reference,脑中应该浮现一些名词,gc.ReferenceQueue.SoftReference.WeakReference.PhantomReference.FinalReference以及最常见的强引用.我认为当一个小白开始学习Reference的时候应该想一个问题,强引用不够好么,为什么我还需要弱引用.软引用等等这些东西. 为什么我们需要它们 应用程序经

java.lang.Void类源码解析_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code null} * @throws SecurityException if the current thread cannot create a * thread in the specified thread grou

java单例类/

java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一但有了初始值,就不能被重新赋值 static修饰的成员变量可以在静态代码块中 或申明该成员时指定初始值 实例成员可以在非静态代码块中,申明属性,或构造器中指定初始值 final修饰的变量必须要显示初始化 final修饰引用变量不能被重新赋值但是可以改变引用对象的内容分(只要地址值不变) final修

Java 对象和类

1.访问实例变量和调用成员方法: 2. 在该例子中,我们创建两个类:Employee 和 EmployeeTest. 首先打开文本编辑器,把下面的代码粘贴进去.注意将文件保存为 Employee.java. Employee类有四个成员变量:name.age.designation和salary.该类显式声明了一个构造方法,该方法只有一个参数. 程序都是从main方法开始执行.为了能运行这个程序,必须包含main方法并且创建一个实例对象. 下面给出EmployeeTest类,该类实例化2个 Em

Java 第八章 类的方法(一) 笔记

Java 第八章 类的方法(一) 一.类的方法语法: 访问修饰符 返回值类型 方法名(){             方法体:      } 二.方法名的规范:     1.必须以字母."_"或"$"开头     2.可以有数字,但不能以数字开头.     3.如果方法名是多个单词组成 ,第一个单词的首字母小写,      其后单词首字母单词大写.     4.方法名都采用动词. 三.方法的返回值     1.有返回值:必须告知返回值的数据类型,并且返回相应的值. 

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

浅析Java.lang.ProcessBuilder类

最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述      ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法.在J2SE 1.5之前,都是由Process类处来实现进程的控制管理.      每个 ProcessBuilder 实例管理一个进程属性