强引用和弱引用

Quietor 9月10日提问
0

1.今天看了一个博客来讲ThreadLocal用到了弱引用,发现自己没有真正体会到弱引用和强引用之间的区别,因此自己基于目前对强引用和弱引用的理解,写了如下代码,希望社区的朋友能帮我解答一下
2.代码如下:
类A:

    import java.lang.ref.WeakReference;
    public class A<T> extends WeakReference<T> {
        public A(T referent) {
            super(referent);
        }
    }

类B:

    public class B {
    }

类C:

    import java.lang.ref.WeakReference;
    public class C {
        private B b = new B();
        private WeakReference<B> a = new A<B>(b);

        public WeakReference<B> getA() {
            return a;
        }
    }
    

3.请问在上述代码中,类A与类B,类A与类C,类B与类C之间的引用关系分别是什么?

如果我调整类A的代码如下:
    import java.lang.ref.WeakReference;
    private B b;
    public class A<T> extends WeakReference<T> {
        public A(T referent) {
            super(referent);
        }
    }

引用关系又有和变化?

2个回答

1

已采纳

执行gc运行下,就明了了


0

1.首先这边问的类A与类B,类A与类C,类B与类C是什么引用关系?
纠正一下,应该说引用是相对一个实例来说的是强引用还是弱引用的。
比如说

Object a=new Object()

上面我使用new创建了一个Object对象,使用new Object()创建的对象中 a->new OBject(),其为强引用模式

2.弱引用:其为在gc垃圾回收的时候会被回收

Object a=new Object()
WeakReference<Object> wf = new WeakReference<Object>(obj);
Object b=wf.get()

在这里获取的b为弱引用,由于采用了WeakReference创建出来,使用get()得到的b对象,当然有的时候由于被垃圾回收机制回收了该对象可能是null对象,此时候b为Objectd的弱引用,a为Object的强引用
当我在后面加一句话:a=null;时候该new Object()创建出来的对象本身由于强引用关系被释放了,导致其只有了弱引用关系了。

也就是说:

1.在图中可以看出,new Objet()在a=null语句没有被执行的时候,该对象为强引用对象,不能被垃圾回收机制所回收!
2.当a=null执行之后,强引用关系结束后,只有弱引用关系了,该对象为弱引用对象了

撰写答案