首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

关于单例模式的初记

2012-10-08 
关于单例模式的小记今天看到单例模式,10分钟就把这节过完了,确实是最简单的模式。但是该模式在并发的时候,

关于单例模式的小记

今天看到单例模式,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了~~
?

1 楼 boli.jiang 2011-12-12   好厉害的二妹

热点排行