转自http://blog.csdn.net/historyasamirror/archive/2010/12/14/6076505.aspx
没有想到有一天真的会用到SoftReference,学的时候完全不知道这东西能干吗。
今天它确实派上用场了,没错,我也是用它来做cache。
SoftReference的语义就是当内存不够用的时候,GC会回收SoftReference所引用的对象。所以,在memory sensitive的程序中将某些大型数据设置成SoftReference再合适不过了。
创建一个SoftReference:
- Object obj = new Object();
- SoftReference softRef = new SoftReference(obj);
- obj = null;
最后那句“obj = null”很重要。如果不将obj设置成null,那么new出来的Object就会有一个"strong reference",如果这样,softRef就不能发挥作用了。
使用SoftReferene:
- Object obj2;
- obj2 = sr.get();
- if (obj2 == null) // GC freed this
- sr = new SoftReference(obj2 = new Object());
因为是SoftReference,所以有可能已经被GC回收了,所以需要判断sr.get()的返回值是否为null。如果是的话,就再重新new一个Object。这里的最后一行代码也很有讲究,比如,也许会这么写:
- Object obj2;
- obj2 = sr.get();
- if (obj2 == null) {
- sr = new SoftReference(new Object());
- obj2 = sr.get();
- }
这样的问题就在于GC可能发生在"sr = new SoftReference(new Object());"和"obj2 = sr.get()"之间,那么obj2仍然有可能为null。
Reference:
http://www2.sys-con.com/itsg/virtualcd/java/archives/0507/shields/index.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步