SoftReference的主要特点就是在当内存不够的时候,GC会回收SoftReference所引用的对象。所以,在memory sensitive的项目中将某些数据设置成SoftReference可以避免内存的溢出。
创建一个SoftReference
SoftReference<Map<String, String>> softReference = new SoftReference<Map<String, String>>(new HashMap<String, String>());
需要注意放入SoftReference的对象最好不要在其它地方有引用,否则就有可能产生"strong reference",如果这样,SoftReference就不起作用了。
使用SoftReferene
Map<String, String> map = softReference.get(); if (map == null) { softReference = new SoftReference<Map<String, String>>( map = new HashMap<String, String>()); }
因为是SoftReference,有可能已经被GC回收了,所以需要判断softReference.get()的返回值是否为null。如果是的话,就再重新new一个。注意这里的map赋值代码,如果写成这样:
Map<String, String> map = softReference.get(); if (map == null) { softReference = new SoftReference<Map<String, String>>( new HashMap<String, String>()); } map = softReference.get();
GC有可能发生在softReference = new SoftReference<Map<String, String>>(new HashMap<String, String>())和map = softReference.get();之间,那么map仍然有可能为null,虽然这种几率小到几乎不存在。
Map<String, String> map = softReference.get(); 这样不会把软引用变成强引用吗
有大佬解答一下吗