jdk四种引用类型的作用及区别

一,简介

       在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的实现。

猜你喜欢

转载自pandan-xyz.iteye.com/blog/2271890
今日推荐