2008-04-15
一个半例模式
关键字: 单例模式 volatile最近做的项目中,有一个特殊需求: 设计一个多机环境中的cache,如果其它服务器更新了数据,需要重新reload数据,更新缓存。但是在没有得到新的cache前,老的cache依然能使用。 这就介于有一个存在的cache实例的同时,可以存在一个正在construct的新cache,自己觉得不像单例模式,姑且就叫一个半例模式
public class CategoryCache
{
private static final Logger logger = Logger .getLogger(CatagoryCache.class);
private static volatile CategoryCache cache;
// after all variants initialized
static
{
cache = new CategoryCache();
}
private CategoryCache()
{
load();
}
static CategoryCache getInstance()
{
return cache;
}
Category getCategory(String name) { ...... }
void addCategory(Category category) { ..... }
public static void process(Object obj)
{
........
reload();
}
private void load() { ........ }
private static synchronized void reload()
{
CategoryCache temp = new CategoryCache();
cache = temp;
}
}
cache在当前jvm只有一个实例,所以都通过getInstance方法获取,需要注意的是,创建cache实例的时候是放在static块中的,原因是不能保证jvm初始化变量的顺序,如果load方法需要使用成员变量,则有可能抛出NullPointException
process是接受到消息时,用于通知当前cache需要重新构建
reload方法实现了重新构建cache.需要注意,不能直写成CategoryCache cache = new CategoryCache(); 因为cache变量被标识为volatile,所以如果在构建的过程,一个线程调用getInstance,会得到一个构建不完全的对象。并且在当前的情况下,其它线程仍然可以使用老得cache,这就出现了一个老的cahce+一个构建中的cache
评论
williamy
2008-04-15
老的cache不過期,新cache生成的結束刪除老cache不就是你想要的?
你這個模式就有且只有你用且只用一次!
你這個模式就有且只有你用且只用一次!
卒子99
2008-04-15
相当奇怪,javaeye的编译器好像有点问题,感觉没有以前的好用
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 21874 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
接口,抽象类的使用
楼主需要的接口可以简化为Iterable<YourDataType>
-- by taowen -
接口,抽象类的使用
对于lz的设计我建议 如果是 "多文件格式读取数据"行为,你可以设计成接口如果是 ...
-- by hunter001201 -
接口,抽象类的使用
抽象类与接口的关系,本质是类与接口的关系.到底什么可以划分到类,什么需要借口? ...
-- by hunter001201 -
接口,抽象类的使用
我觉得抽象内和继承相关,比如拿文档类来说,都有title,time属性,并且ge ...
-- by zfyyfz -
接口,抽象类的使用
从面向对象分析与设计的角度来说:abstract class表示“is-a”的关 ...
-- by WorldHello






评论排行榜