在使用Guava作为本地缓存的时候,已经添加的缓存,用getIfPrensent获取为空。
cache创建代码如下:
public static Cache<Integer, Map<String, String>> cache = CacheBuilder.newBuilder().initialCapacity(1000)
.expireAfterAccess(60, TimeUnit.SECONDS)
.removalListener(removalListener)
.weakKeys()
.weakValues()
.build();
获取缓存会出现以下情况:
1)cache中有内容,但是getIfPrensent获取为空。
2)cache中没有内容,但是debug的过程中看到localCache有put成功。
3)cache中有内容,getIfPrensent能成功获取。
解决办法:删除创建cache时的 .weakKeys().weakValues()。
思路:
弱引用有以下特点:
1)弱引用只能用==比较,不能用equals
2)弱引用在没有其它(强或软)引用时,缓存项可以被垃圾回收
3)WeakHashMap应用于以下场景:
我们将一个Object作为key存到hashMap中,如果key没用了,我们将这个key==null,但是只要hashMap是活跃的,map中的对象永远无法被回收,因为程序中不再出现key了,所以这个键值对也无法从map中移除。
如果使用WeakHashMap,程序会周期性的检查没有其他强或软引用的key,并删除对应条目。
猜测Guava的缓存获取数据应该是走的ConcurrentHashMap的逻辑,通过equals来比较,所以有值的时候找不到,没有强引用的时候,对象有可能被回收。