一,简介
在java中提供了四种引用的类型。分别为StrongReference、WeakReference 、SoftReference以及 PhantomReference。
二,四种引用类型的作用及区别
StrongReference:强引用类型。是java 的默认引用实现,如果不特别指定,代码中使用的都是强引用。只要对象存在强引用,则gc的时候都不会清理掉该对象。
WeakReference:弱引用类型。通过WeakReference引用的对象,如果没有该对象的强引用。则gc的时候会清理掉该对象。
SoftReference:软引用类型。通过SoftReference引用的对象,即使没有该对象的强引用。gc时也不会回收该对象。只有当jvm内存不足时才会被回收, 这一特性使得 SoftReference 非常适合缓存应用数据。
PhantomReference:虚引用类型。由于使用场景极少,不做解释。
三,应用举例
static class User implements Serializable{ private static final long serialVersionUID = 1L; private String name = null; public User(String name){ this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static void main(String[] args) { //強引用类型:变量strongReference对对象的引用为强引用 User strongReference = new User("strongReference"); System.out.println(strongReference.getName()); //弱引用类型: 变量weakReference对对象的引用为弱引用 WeakReference<User> weakReference = new WeakReference<User>(new User("weakReference")); System.out.println(weakReference.get().getName()); //软引用类型: 变量softReference对对象的引用为软引用 SoftReference<User> softReference = new SoftReference<User>(new User("softReference")); System.out.println(softReference.get().getName()); User user = weakReference.get();//user对对象的強引用 System.out.println(user.getName()); user = null;//清除強引用 weakReference.clear();//清除弱引用 softReference.clear();//清除软引用 } //弱引用测试 WeakReference<User> weakReference = new WeakReference<User>(new User("weakReference")); System.out.println(weakReference.get());//user对象 System.gc();//调用jvm 垃圾回收器(不一定立即执行) Thread.sleep(10000);//阻塞线程10秒,等待gc执行 System.out.println(weakReference.get()); //null
具体JDK案例,可参考WeakHashMap的实现。