1
rogerchen 2016-12-25 11:10:13 +08:00 1
不太会 java ,回答权当抛砖引玉吧。
Java 的弱引用是用一个特殊泛型来实现的, java.lang.ref.WeakReference 。对象的类型就指明了对象的引用类型。不管这个对象是自己拉起来的还是别人传入的,对象的类型都是明确的,不存在说判断 Weak 还是 Strong 的问题。倒是有可能出现 Weak , Soft 和 Photom 通过 Reference 接口传入判断不了的问题。 |
2
iFlicker 2016-12-25 12:29:56 +08:00 via Android
1 楼说的蛮有道理的,你是想造轮子嘛用自动化工具审查代码?
|
3
ovear 2016-12-25 13:15:36 +08:00 1
为啥要判断,当你使用 WeakReference 的时候,如果把它赋值给了其他变量,那么他就变成强引用了
//创建弱引用 WeakReference wrObj = new WeakReference(new Object()); if(wrObj.get() == null)} //对象被释放了 } //创建了一个强引用 Object srObj = wrObj.get(); if(srObj == null){ //获取的时候对象就被释放了,强引用创建失败,关联值为 null } else { //获取对象的时候,对象还没被释放,强引用建立成功,关联值为 原始的 Object //此时指向 Object 的引用含有强引用, srObj 的作用范围结束前 GC 都不会回收 Object } 你可以理解为, Java 的 GC 就是一个计数器,只有满足无 强引用 的时候才会回收。一旦你赋值对象本身的引用,就是在建立强引用。 所以判断方法很简单,请使用 instanceof |
4
lawfun OP @iFlicker 就是有点好奇,通过 弱引用 得到对象 a ,又通过强引用从这个 a 中又得到另外一个对象 b ,那 对于 对象 b 来说是多了一个弱引用还是多了一个强引用。还是每一个引用都有一个通向 root 的路径,然后判断下 路径中只要有 弱引用那就是 整条路都是弱引用
|
5
ovear 2016-12-25 13:50:50 +08:00 1
@lawfun A -> B 如果不是通过 WeakReference 包装过的,都是强引用。
如果你得到的对象 B ,直接用的 = 赋值,强引用。 如果 B 没有引用 A ,指向 A 的都是弱引用。 如果 B 引用了 A ,那么指向 A 的就有强引用了 然后看看上面的 GC 回收条件,就知道了 |
6
franklinyu 2016-12-25 13:51:13 +08:00 1
弱引用得到的 a 不是對象,是對對象的引用。並沒有「得到」那個對象。對象還是對象,沒有弱對象和強對象。
|
7
lawfun OP |