今天看到单例模式,10分钟就把这节过完了,确实是最简单的模式。但是该模式在并发的时候,确实很容易出问题,如下:
第一个问题就像《HeadFirst》上提醒的,获取单例的时候需要加锁(或者双保险检查、饱汉初始一个对象等),否则就不是真是真正的单例了。
public static synchronized Sington getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
如果不加锁,在并发的时候,可能两个线程读到instance为空,都去创建了实例。
第二个问题,是以前我测Lucene的时候遇到的,读Lucene文件的Reader是一个单例,在main方法中执行没有问题,大并发做压力测试时候,reader.doSomething()这个方法就抛出空指针。而调用该方法之前是对reader做了非空判断的。
记不清具体的方法了,大概举例模拟下下面的场景
读索引的方法:
public void read(){
If(reader!=null){
reader.doSomething();//这句话报NullPointException
}
}
跟新索引的方法:
public void update(){
If(reader!=null){
…
…
reader = null;
}
}
由于reader是个单例,一个线程A判断reader是非空的,还没来得及执行reader.doSomething(),这个时候另外一个线程B刚好又把reader置为空了,于是线程A继续执行到reader.doSomething就抛出NullPointException了~~
分享到:
相关推荐
【咬人草小记,阅读附答案】 咬人草小记阅读答案.docx
流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记.流程图与控制流图课堂小记....
TCP-IP小记
环境: Linux s12084 2.6.9-67.ELsmp #1 SMP Wed ...小记一下。以备以后参考。 boost 库做得真好。在windows 平台, linux 平台下编译都很顺利。hp aCC 也宣称对 boost 1.35 完全支持 。 全部编译是很痛苦的过程
关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记关于开发过程中注意点的小记
关于发展学生空间观念的主题教研活动小记.pptx
很全面的,很实用的,看完提高不少,不管新手老手,都绝对有用
python进行爬虫小记,主要用于python快速入门理解。
随笔小记.doc
GeoStudio学习小记
c语言理论知识小记
海居小记
我做java web 多年的小记,希望能打大家有用
asp.net Jmail组件使用小记
从链表到模式匹配,矩阵,广义表,树,图,回溯,排序等等,严蔚敏书中 80% 的算法都自己实现,用C++语言,做个总结,也做点贡献。 拾荒小记
redis安全学习小记1
本草缘·种植小记
NULL 博文链接:https://zfwdl2005.iteye.com/blog/1308748
vuex使用方法,小记总结
Sqlite数据库sqlite3命令小记