一,简介
在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的实现。