`
sonyfe25cp
  • 浏览: 202650 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例模式结合观察者模式

阅读更多
起因:多线程对数据库写操作
办法:让多线程先把数据写到一个公共的arraylist中,等这个list足够大的时候,单开一个线程进行写操作。
方案:
      首先,将这个arraylist使用单例模式思想,这样就可以让多线程都用它,并且写一起。
      然后,用观察者观察这个arraylist的长度,如果到了指定长度,就进行写操作,同时清空这个arraylist,方便多线程们继续使用。
      结果,实现了!!


-----
感谢对此方案提出过宝贵意见的 姜同学,小强同学,大师同学~~~hoho~~排名不分先后~~O(∩_∩)O哈哈~

demo: 让一个循环让单例的arraylist写数字...每当arraylist长度到5的时候,打印arraylist,并且置空。

代码如下:
Singleton.java    单例的类

package testArray;


import java.util.ArrayList;
import java.util.Observable;

public class Singleton extends Observable{
	
	private ArrayList<String> arrayList=new ArrayList<String>();
	
	private static Singleton singleton=null;
	
	/**
	 * 避免被继承
	 */
	private Singleton(){
		
	}
	
	/**
	 * 产生单例
	 * @return
	 */
	public static Singleton getInstance(){
		if(singleton==null){
			singleton=new Singleton();
		}
		return singleton;
	}

	/**
	 * 只要能置空arraylist就行.
	 */
	public static void clearInstance(){
		singleton.arrayList.clear();
		
	}
	public  void putElement(String str){
		arrayList.add(str);
		if(arrayList.size()>5){
			setChanged();  //触发观察者模式
			notifyObservers(arrayList);
		}
	}
	
	

}



DataOperation.java  操作类
package testArray;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

public class DataOperation implements Observer {

	private ArrayList<String> arrayList=null;
	
	public void update(Observable o, Object arg) {
		if(arg instanceof ArrayList){
			arrayList=(ArrayList)arg;
			for(String s : arrayList){
				System.out.println(s);
			}
			System.out.println("*********************************");
			Singleton.clearInstance();//想在这里让那个单例的list置空
		}
		
	}

}



测试类 Test.java
package testArray;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Singleton singleton=Singleton.getInstance();
		singleton.addObserver(new DataOperation());
		int i=0;
		while(i<12){
			singleton.putElement(i+":ele");
			i++;
		}
		
		
	}

}



结果:
0:ele
1:ele
2:ele
3:ele
4:ele
5:ele
*********************************
6:ele
7:ele
8:ele
9:ele
10:ele
11:ele
*********************************

分享到:
评论
15 楼 Durian 2010-01-18  
servlet必须要singlone吗?
我记得rod大牛批评过singlone模式,说这个模式限制很多,。
14 楼 xuyan2680 2010-01-15  
tjgamejx2 写道
楼主实现的不就是一个缓存么,应该用HashTable好些。

也可以用时间线程定期数据入库。

------------------------------

有一个我不明白,为什么要开单例。为了什么?

==============================

你用单例就是为了让这几个线程共享内存啊,你传全局参不就行了吗。

如果你的意思是,这几个线程不是运行在一个容器里(比如一个servlet,一个main方法),让他们共享内存的话,结果是:他们是共享不到资源的。单例只是在一个进程中单例,只能这一个进程中的多个线程才能共享资源的。



有同感!
13 楼 howwi 2010-01-07  
刃之舞 写道
并发不高,直接每次都直接存储到数据库,

是的,相信数据库的同步,比自己写保险的多。
12 楼 hopeless 2010-01-06  
sonyfe25cp 写道
hxpterry 写道
个人觉得有这样几个问题:
1.getInstance()方法层中访问冲突,应该同步,加上synchronized
2.如果putElement()函数没程序区调用或很长时间才调用,那里面现有的数据岂不是一直不会写到数据库

确实有上述问题

1.访问冲突..这个还没想清楚..=.= 我测试测试
2.这个确实是有的。主要我的系统中要存的这些都是用户信息..所以..少那么几个..或者延迟了..都影响不大..只要迟早能进库就行..不是那种安全性和实时性很高的.


确实,楼主代码中的很多方法都没有考虑多线程的问题,不止getInstance()这个。

11 楼 刃之舞 2009-12-28  
并发不高,直接每次都直接存储到数据库,
10 楼 andyu2008 2009-12-26  
sonyfe25cp 写道
hxpterry 写道
个人觉得有这样几个问题:
1.getInstance()方法层中访问冲突,应该同步,加上synchronized
2.如果putElement()函数没程序区调用或很长时间才调用,那里面现有的数据岂不是一直不会写到数据库

确实有上述问题

1.访问冲突..这个还没想清楚..=.= 我测试测试
2.这个确实是有的。主要我的系统中要存的这些都是用户信息..所以..少那么几个..或者延迟了..都影响不大..只要迟早能进库就行..不是那种安全性和实时性很高的.


不是那种安全性和实时性很高的, 为什么不直接用各线程直接写到数据库? 把程序搞这么复杂干嘛?让程序简单、健壮的运行才是王道!
9 楼 sonyfe25cp 2009-12-24  
(⊙o⊙)哦~原来可以有这么多解决方案..
谢谢大家~~

这个缓冲就是为了网页多并发的..
每一个用户打开页面后我都收集一些用户信息,通过ajax传到服务器.
然后放到这么一个缓冲里,再存入数据库.

8 楼 rocy 2009-12-24  
其实就是一个BlockingQueue的事,这两个模式组合的生搬硬套了,还不解决需求
7 楼 only_java 2009-12-23  
单线程下应该没什么问题,多线程的话明显就是生产者消费者模型了。。。
6 楼 tbest 2009-12-23  
应该用现有的成熟的缓存解决方案。。。
还有,为什么要单例?一个sync的全局变量不就完了?
5 楼 keshin 2009-12-23  
lz,你这个不单单例这里会有线程问题
put和clean两个方法也有线程问题。

4 楼 tjgamejx2 2009-12-23  
楼主实现的不就是一个缓存么,应该用HashTable好些。

也可以用时间线程定期数据入库。

------------------------------

有一个我不明白,为什么要开单例。为了什么?

==============================

你用单例就是为了让这几个线程共享内存啊,你传全局参不就行了吗。

如果你的意思是,这几个线程不是运行在一个容器里(比如一个servlet,一个main方法),让他们共享内存的话,结果是:他们是共享不到资源的。单例只是在一个进程中单例,只能这一个进程中的多个线程才能共享资源的。
3 楼 玲cc 2009-12-23  
大概看了一下,在创建单例的代码中没有实现同步,并发情况下会有问题。
2 楼 sonyfe25cp 2009-12-23  
hxpterry 写道
个人觉得有这样几个问题:
1.getInstance()方法层中访问冲突,应该同步,加上synchronized
2.如果putElement()函数没程序区调用或很长时间才调用,那里面现有的数据岂不是一直不会写到数据库

确实有上述问题

1.访问冲突..这个还没想清楚..=.= 我测试测试
2.这个确实是有的。主要我的系统中要存的这些都是用户信息..所以..少那么几个..或者延迟了..都影响不大..只要迟早能进库就行..不是那种安全性和实时性很高的.

1 楼 hxpterry 2009-12-23  
个人觉得有这样几个问题:
1.getInstance()方法层中访问冲突,应该同步,加上synchronized
2.如果putElement()函数没程序区调用或很长时间才调用,那里面现有的数据岂不是一直不会写到数据库

相关推荐

    NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】

    主要介绍了NodeJS设计模式,结合实例形式总结分析了nodejs单例模式,适配器模式,装饰模式,观察者模式的概念、原理与具体实现技巧,需要的朋友可以参考下

    PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

    主要介绍了PHP中常用的三种设计模式,结合实例形式详细分析了php单例模式、工厂模式与观察者模式概念、功能、相关使用技巧与操作注意事项,需要的朋友可以参考下

    23种设计模式项目实例

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    开发模式demo

    实现的模式有单例模式、观察者模式、装饰者模式、状态模式,大家可以结合模式定义进行具体学习

    python设计模式第2版.pdf

    设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计...全书囊括单例设计模式、工厂模式、门面模式、代理模式、观察者模式、命令模式、模板方法模式、复合模式、状态设计模式以及反模式等多种设计模式。

    JAVA23种设计模式及快捷记忆

    工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、...

    C++设计模式

    (十)观察者模式 23 (十一)抽象工厂模式 28 (十二)状态模式 32 (十三)适配器模式 34 (十四)备忘录模式 37 (十五)组合模式 39 (十六)迭代器模式 45 (十七)单例模式 46 (十八)桥接模式 47 (十九)...

    java设计模式

    内容包括设计模式概述、面向对象设计原则、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式、职责链模式、...

    C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题示例

    主要介绍了C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题,简单讲述了观察者模式的原理并结合具体实例形式分析了使用观察者模式解决牛顿童鞋成绩问题的具体步骤相关操作技巧,并附带demo源码供读者下载参考,...

    研磨设计模式(完整带书签).part2.pdf

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    行为类型模式,共十种:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,注释模式,状态模式,访问者模式,中介者模式,解释器模式。 设计模式的六大原则 开闭原则(Open Close Principle)...

    DragDrop:单例拖放结合自定义动画的简单拖放功能

    Description 用到了单例模式+自定义动画的观察者模式+封装拖放 Author manfredHu胡文峰

    研磨设计模式(完整带书签).part1.pdf

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    Python 设计模式 第2版

    全面揭示有关设计模式的内容,并结合Python语言进行示例化的解析。全书囊括单例设计模式、工厂模式、门面模式、代理模式、观察者模式、命令模式、模板方法模式、复合模式、状态设计模式以及反模式等多种设计模式。

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第9章 观察者(observer)模式 72 第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 ...

    研磨设计模式-part2

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    研磨设计模式-part4

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    研磨设计模式-part3

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    研磨设计模式.part3(共4个)

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

    研磨设计模式.part2(共4个)

    第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式...

Global site tag (gtag.js) - Google Analytics