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,虽然这种几率小到几乎不存在。

你可能感兴趣的内容
2条评论
fandigu69 1年前

Map<String, String> map = softReference.get(); 这样不会把软引用变成强引用吗

fandigu69 1年前

有大佬解答一下吗

selfly

交流QQ群:32261424
Owner