最近遇到一个问题:在使用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 这两个方法对应的源码

 public V get(K key) throws CacheException {
     return map.get(key);
 }

 public V put(K key, V value) throws CacheException {
     return map.put(key, value);
 }

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

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

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

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

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

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

最新文章

  1. Linux下的Apache和PHP安全设置,如何开启PHP的安全模式
  2. webbench 压力测试
  3. %1$s,%2$s等的用法
  4. Jmeter在restful风格接口测试中的应用
  5. Entity Framework 第九篇 关于自增列的事务处理
  6. DOMContentLoaded和load
  7. Oracle数据库名、实例名、数据库域名、数据库服务名、全局数据库名的辨析
  8. http报头正文开头会有一个整数的问题
  9. maven配置编译路径
  10. 解决ie8不兼容jquery trim问题
  11. tcl/tk实例详解——glob使用例解
  12. IOS网络开发实战(二)
  13. Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现
  14. 输出一个string的所有排列情况
  15. SQL Server 索引维护sql语句
  16. css padding和margin的百分比
  17. iOS-Xcode编码自动补全失效
  18. 安全测试学习之bWAPP环境搭建
  19. ln 链接命令 简要说明 软硬链接关系说明
  20. 实现instanceof关键字

热门文章

  1. IOS APP 瘦身
  2. 【转】JavaScript 中值得注意的 for 循环
  3. Object中的clone方法
  4. 深入理解linux源码安装三板斧
  5. Oracle 查看session级别信息
  6. Django运行SQL语句
  7. 命令式编程 vs 声明式编程
  8. 机器学习基础(HGL的机器学习笔记1)
  9. java安装以及jdk和jre安装(简单了解)
  10. Android学习笔记_52_全面了解Android开发规范:性能及UI优化