误删 EhCache 中的数据?

2018-07-19 05:38:09来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

最近遇到一个问题:在使用ehcache时,通过CacheManager.getCache(chachename).get(key),获取相应的缓存内对象(当时这个对象是个list), 有个同事写个方法使用 removeall 来删除list中不需要的对象,返回剩下的对象组成的list (这里没有put 去更新ehcache)。问题就出现在removeall 这个操作,这个操作把缓存里面的list里的数据也删除了一部分。

查了一下 ehcache 存储机制: 堆内存储
再看看ehcache 的源码
org.apache.shiro.cache.MapCache 这个类实现了 org.apache.shiro.cache.Cache 这个接口
其中put 和 get 这两个方法对应的源码

1 public V get(K key) throws CacheException {
2     return map.get(key);
3 }
4 
5 public V put(K key, V value) throws CacheException {
6     return map.put(key, value);
7 }

其中map 是 java.util.Map, 那么在我的记忆中 map 是就是存在堆栈里面的
回顾一下:

1 A a1 = new A();
2 A a2 = a1;

其实a1 和 a2 指向的同一个堆栈的地址,并不是两个真正的对象,而是两个引用一个对象。

所以在调用ehcache 的时候,put 和 get 是指向堆栈里的同一个地址,get的时候并没有获取到一个新的对象,而是把引用给返回回去;如果直接操作,则会改变ehcache 中的值,当你在别的方法中调用可能就会产生数据的错误,这还是值得注意的。

以上纯属个人观点,如有错误请留言指正,谢谢

文章版权由作者Gonson和博客园共有,若转载请于明显处标明出处:https://www.cnblogs.com/gonson/p/9329531.html 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:LinkedList集合 实现栈和队列

下一篇:压缩文件工具类