论坛首页 Java企业应用论坛

一个半例模式

浏览 1990 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-15  

最近做的项目中,有一个特殊需求: 设计一个多机环境中的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

   发表时间:2008-04-15  
相当奇怪,javaeye的编译器好像有点问题,感觉没有以前的好用
0 请登录后投票
   发表时间:2008-04-15  
老的cache不過期,新cache生成的結束刪除老cache不就是你想要的?

你這個模式就有且只有你用且只用一次!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics