浏览 4811 次
锁定老帖子 主题:单列设计模式在实际开发中的一个应用
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-20
在开发中经常用到select的标签将数据加载,供用户选择,我最近在开发一个跟帐务有关的应用系统,系统中包括了很多查 询功能,比如那款游戏进行查询,每次到查询页面,必须要显示所有游戏,为了避免每次打开该页面都要查询数据库的话那执 行效率就会很低。所以我写了一个缓存,简单解决这个问题。供大家查考! java 代码
注:记录本人在开发中遇到的问题,与大家一起交流,如果有的好的解决方法,请指导一下,谢谢!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-28
请教一下:
你上面实现单例模式时使用了双重检查成例,不过我在<<Java与模式>>一书当中看到过:双重检查成例一般不适用于Java语言. 这是书中原话: 双重检查成例的"懒汉式"单例类不能工作的基本原因在于,在Java编译器中SystemInfoCache类的初始化与instance变量的赋值顺序不可预料。如果一个线程在没有同步化的条件下读取instance引用,并调用这个对象的方法的话,可能会发现对象的初始化过程尚未完成,从而造成崩溃。 这段话的意思我不时很明白,能给我解释一下吗? 谢谢 |
|
返回顶楼 | |
发表时间:2007-08-28
请看http://www-128.ibm.com/developerworks/java/library/j-dcl.html
楼上的,那个意思是,instance已经指向了一个新的SystemInfoCache的实例,但是构造函数尚未执行,如果另一个线程这个时候进入就会面对一个还没有初始化完成的对象从而失败。 |
|
返回顶楼 | |
发表时间:2007-08-28
不仅仅是double check的有问题,在迭代过程以及调用contains、size之类需要迭代的方法时也应当加锁
|
|
返回顶楼 | |
发表时间:2007-09-18
double check在JDK 5以上可以实现了(据说是修改了JVM),但仍然不推荐 使用。
其实用下面的代码更好,还省去了synchronize的开销,同样也是线程安全的。 private static Map map = null; private static SystemInfoCache instance; static { loadMap(); instance = new SystemInfoCache(map); } private SystemInfoCache(Map map) { } public static SystemInfoCache getInstance() { return instance; } |
|
返回顶楼 | |
发表时间:2007-09-23
同意楼上的观点 :)
|
|
返回顶楼 | |
发表时间:2007-09-25
Pan Feng 的 单例工厂方法
public static SystemInfoCache getInstance() { return instance; } 不用加 synchronized 同步? |
|
返回顶楼 | |
发表时间:2007-09-25
初始化和new 的动作这里已经做了
static { loadMap(); instance = new SystemInfoCache(map); } 那个getInstance只是个return而已 |
|
返回顶楼 | |
发表时间:2007-09-25
singleton一般有2种,
一种是类加载的时候就把所有的事情做了,然后getinstance的时候就只是return,这样的叫做饿汉型。 另外一种是在getinstance的时候才去判断是否初始化过,如果还没初始化过就初始化,然后return,这样的叫做懒汉型 |
|
返回顶楼 | |