就在前两天,在编写一段业务逻辑的时候,考虑到数据库中的数据值是固定的,为了提高效率,自己做了一个Map的缓存,大致代码如下。
//缓存类
@service
public class CacheService{
private Map<String,List<Object>> cache = new Concurrenthashmap<>();
public List<Object> get(String key){
return cache.get(key);
}
public void put(String key, List<Object> list){
cache.put(key,list);
}
public void del(String key){
cache.remove(key);
}
}
如上代码,乍看下来不会有什么问题,功能也可以正常实现。但是其实他是极其不安全的。
为什么怎么说?当我们其他的service把这个cache依赖注入的时候,如果要执行如下代码。执行之后会有什么问题?
List<Object> list = cacheService.get("A");
for(int i = list.size()-1 ; i >=0 ; i -- ){
if(needRemove){
list.remove(i);
}
}
执行完之后,当下次另外一个地方也需要去取cacheService中的“A”的时候,会发现LIST中元素的内容变少了,原因是,cacheService在放入和取出的时候都没有做copy,没有做copy导致的外部获取的list和内部cacheService中list的地址是同一个,外部修改的话,会同时修改掉内部的list的元素。这样的做法是极其不安全的。所以,只需要在get 和 put方法中添加collections.copy() 就不会出现如上的问题了。同样的问题还会出现在其他类似的集合中。
注:可以依赖一些代码规范检查的服务器或者插件,他们也可以帮你检查出类似的问题,比如获取数组的时候,需要clone等等
分享到:
相关推荐
山寨网线显形记山寨网线显形记山寨网线显形记
山寨版qq源码.素材
其中一个项目用到了别踩白块儿的游戏,想要做这种游戏,笔者一开始用的是网上开源的html5脚本---当然是那种压缩版的,慢慢跟着客户的要求改,生不如死,所以就重新用lufylegend写了一个。
山寨E盾,将需要登陆的程序山寨到本地,或者指定的服务器上
山寨版qq源码素材山寨版qq源码+素材山寨版qq源码+素材山寨版qq源码+素材
山寨主板的BIOS ROM
山寨版iphone4游戏,我自己的源代码
在手机模拟MTK山寨手机mrp的软件。诺记也可以玩山寨机上的东西了哦。
Java山寨超级马里奥Java山寨超级马里奥Java山寨超级马里奥Java山寨超级马里奥
java版山寨QQ项目 里面有四个压缩包 QQ服务器端.rar QQ客户端.rar 改进QQ客户机服务器视频实现.rar Q第三方库.rar 这个java版山寨QQ项目实现的功能有: 1.实现的java视频聊天; 2.集成了Mina框架; 3.服务器管理...
山寨版qq软件,java爱好者,客户端以及后台数据库服务器支持
修复U盘.好工具。万能优盘修复工具,市场上大量山寨U盘,坏了其实可以自己搞定的。
1. 韩顺平老师山寨QQ项目 2. 手打注释,非常完善,一目了然。 3. 纯手打,代码齐全,测试通过。 4. 功能:对话、上线提示
适用于JAVA全屏游戏,诺基亚山寨N8 N9都可以用
资源分设为1,因为我自己只有3分资源分了,所以就不设为0了 这个山寨QQ代码2000行,基于现在可以使用IP6,给出它的设计原理 功能:山寨QQ 主要行为: ①用户注册 ②添加好友 ③好友上线头像变为彩色 ④在线上的好友...
山寨版QQ2003 java源代码 其中,所用到的IDE为MyEclipse 数据库为SqlServer2000 这个只做参考,有很多功能可以自己实现
山寨机各种机型机芯大收罗,山寨机各种机型机芯
自己用java 写的山寨QQ 请多多指教
实用的刷机工具,山寨版手机的好帮手,山寨手机刷机工具。