我们知道单例模式是多例模式的一个特例,在多例模式中多例类管理着自己的多个实例,自己初始化自己的实例并且向外界提供自己的实例。而且多例类
必须自己初始化自己,外界无法通过调用多例类的构造函数实例化一个多例类。
既然对多例模式有了一个大概的理解,那么现在就来看下多例类在一个具体的环境下的使用。
下面我们考虑一个统计数据的案例,在一个系统中,数据库中存储的数据量很大,数据每月都会以一定的速度增加,现在要的是针对每个月做一次统计,也就是现在
是9月份,那么8月份的统计在以后都会不变,但是如果我们现在要看9月份的统计,那应该是会变得也就是在9月份你今天看到的9月份的统计数据和明天看到的
统计数据时不一样的。这样我们第一次想到的可能就是当每次查询到来的时候我们通过sql语句进行一次统计,我们虎发现的是这样做每次的统计花费的时间(几
十秒)是难以忍受的,那么有没有什么好的办法了。
办法是要的就是把统计数据缓存起来,比如说把统计数据存储到一个文件中比如xml文件,那么下次请求到来的时候我们只要把xml中保存的数据返回给用户就可以啦。
现在的问题又要啦,既然是存储在一个文件中,那么什么时候生成这个文件,什么时候跟新这个文件了。哦,可能很简单那就是每次请求过来的时候如果文件不存在
就生成,如果过时来就跟新,但是我们先在来具体考虑下会发生什么。假设在XX时间有5个请求如果这个时候要生成这个文件那么也就是同时有5个线程在试图生
成这个文件,这个时候会发生什么我们是无法保证的。那么有没有什么好的方法来保证了。
现在我们来看把多例模式变化下,应用到这个环境中来。我们要求得是,当请求到来的时候,我们检查是否要跟新文件或者生成文件,如果要那么我们继续检查是否
已经有线程在跟新这个文件如果要我们只要把当前的请求线程放到等待队列中就可以啦,如果没有那么我们就生成这样的一个跟新线程并且把当前请求线程放在这个
线程的等待队列中。下面我们来看下具体代码的实现。
我们定义一个接口:
public interface INotify {
void finished(boolean flag);
}
这个接口用来当更新线程完成后用来唤醒等待线程。
另一个接口用来把当前请求线程加入到等待队列中:
public interface IWaitingAction extends Runnable {
void addNotifyObject(INotify notify);
}
现在我们来实现这个变种的实例类。
public class TopBookService implements IWaitingAction {
private LinkedList<INotify> list = null;
private String key;
private TopBookService(String key){this.key = key;}
private static Map<String, TopBookService> map = new HashMap<String, TopBookService>();
public static synchronized TopBookService getInstance(String key){
if(map.containsKey(key)){
return map.get(key);
}
TopBookService service = new TopBookService(key);
new Thread(service).start();
return service;
}
public synchronized void addNotifyObject(INotify notify) {
if(list == null){
list = new LinkedList<INotify>();
}
list.add(notify);
}
public void run() {
//生成新的文件。
//在提示之前把service从池中删除 确保每个加入service等待队列中的任务都被提醒啦。
map.remove(key);
if(list != null){
for (INotify notify : list) {
notify.finished(true);
}
}
}
}
线面我们来看具体的Action中做了些什么:
public class BookTopAction extends BaseAction implements INotify {
private boolean finished = false;
public String bookTop()throws Exception{
initResult();
return "json";
}
protected void initResult(){
//判断文件是否需要跟新。
if(needUpdate(fileName)){
//如果要跟新,那么就跟新文件
updateXmlFile(fileName);
//等待更新的完成
while(!finished){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//解析文件并且生成返回结果
}
/**
* 跟新排行榜上前十的书本的xml文件
*
* @return
* @param fileName 被更新的文件名
*/
protected synchronized void updateXmlFile(String filename){
//如果有程序在更新xml文件,那么就直接返回不更新xml文件
TopBookService.getInstance(filename).addNotifyObject(this);
}
protected boolean needUpdate(String filename){
File file = new File(filename);
boolean flag = false;
//判断文件是否要更新或者生成
return flag;
}
public void finished(boolean flag) {
this.finished = flag;
}
}
=============================================================
转载请注明作者:liuhello(http://hi.baidu.com/liuqinglai
)
分享到:
相关推荐
韩山师范学院数学与统计学院在此背景下,通过积极探索和创新实践教学模式,有效解决了数据挖掘专业实践教学中遇到的几个关键问题。 首先,针对数据挖掘专业师资缺乏的问题,韩山师范学院数学与统计学院采取了“内培...
本文详细探讨了大数据时代统计课程,尤其是数理统计课程在教学改革方面的一些研究和实践。 首先,大数据时代的到来对统计专业学生的要求提升到了一个新的高度。大数据战略的提出,使得数据处理和分析成为了国家战略...
ThemeGraph.memoryKeys键列表内的数值代表需要做统计信息地物的SmID值,ThemeGraphItem.memoryDoubleValues值列表里存入的就是需要做专题信息的内存数据,这些内存数据来自多次查询和复杂计算的复合信息、数组、XML...
在高等教育教学中,特别是数据科学与大数据技术专业,概率论与数理统计课程的开设与研究显得尤为重要。该课程是数据科学领域中的核心基础,涉及到概率论的基本概念、原理以及数理统计的应用方法。随着大数据时代的...
Python作为一种简洁易学、功能强大的编程语言,具有良好的可视化能力和丰富的数据分析库,如NumPy、Pandas和Matplotlib等,非常适合用于数理统计的教学。将Python引入课程,可以解决传统教学中的问题,提高学生的...
综上所述,《例说SPSS统计分析》是一本全面介绍SPSS的教程,它通过实例讲解,让读者能够掌握统计分析的基本概念和操作技能,从而在自己的研究或工作中有效地运用SPSS进行数据处理和分析。通过阅读本书,无论是初学者...
数理统计中的相关和回归分析是统计学中的重要概念,主要用来探究两个或多个变量之间的关系。在数学建模和数据分析中,相关性分析能够帮助我们理解变量间是否存在某种关联,而回归分析则能进一步量化这种关系并进行...
以用户和角色的关系为例,一个用户可以拥有多个角色,而一个角色也可以被多个用户所拥有。在这种情况下,需要创建一个关联表来记录用户和角色之间的关系。 以上四种设计模式是数据库设计中常用的策略,每种模式都有...
数理统计大作业的核心是利用统计方法来探索和解析数据中的模式和关系。在这个案例中,学生范嘉楠针对2019-2020赛季英超联赛中阿森纳队的比赛成绩进行了深入研究,以理解球队获胜概率与比赛数据之间的联系。作业主要...
"空间回归模型在人口统计数据空间化表达中的应用——以六安市为例" 空间回归模型的概念 空间回归模型是一种统计模型,用于分析和预测空间数据之间的关系。在人口统计数据空间化表达中,空间回归模型可以用于分析...
新零售模式下生鲜电商盈利模式研究——以盒马鲜生为例 摘要: 新零售模式是将线上电子商务与线下传统门店进行深度融合的一种新型零售方式。盒马鲜生作为其中的佼佼者,以其线上线下一体化的创新模式,迅速成长为...
统计图的运用可以直观地揭示数据的结构和模式,有助于快速理解和解释数据。 在制作统计表和统计图时,应遵循一定的编制原则和要求,确保内容准确、清晰、易读,以充分发挥其在数据分析和报告中的价值。
这一情境设置使学生需要进行数据的收集、整理、编辑、运算、统计和分析,通过图表和数据透视表等形式直观呈现结果,培养他们处理复杂数据的能力。 在方案的呈现与实施部分,作者强调了三个关键模块。第一,澄清概念...
总的来说,这个实验旨在训练学生的编程能力和应用统计决策理论解决实际问题的能力,同时加深他们对模式识别和概率分类法的理解。通过这样的实践,学生能够更好地掌握贝叶斯决策的核心思想,以及如何在不同的分类任务...
而国内高校统计工作多由学校的不同部门兼任,缺乏专职人员,且这些兼职人员往往缺乏专业统计知识,无法运用专业的统计方法和手段来开展调查、研究和分析工作。 2. 统计内容单薄,不能满足大数据时代的需求。国外...
针对小学数学教育,尤其是以“扇形统计图”为例,我们需要摒弃传统浅层学习模式,转而设计能激发学生深度学习的教学活动。深度学习不仅关注知识的表面记忆,更强调理解、系统性、主动性和思维性,以此促进学生数学...
文章提出,通过这样的教学模式,不仅能帮助学生在小学数学“统计与概率”教学中掌握基本的数据处理技能,还能树立起学生在未来学习和生活中的数据意识,使得他们能够科学地应用数据,为培养未来的数据分析和处理人才...
本实例关注的是“基于js模式实现的HTML网页统计图表控件程序”,这是一类使用JavaScript编程语言在HTML页面上创建交互式图表的技术。JavaScript作为客户端脚本语言,允许我们动态更新网页内容,而无需刷新页面,因此...