设计模式-单例
package com.tag2;
public class 单例模式 {
/**
* 应用场景:
* 1. 系统访问人数
* 2. 系统内部事件
* 3. 系统操作日志
* 4. 系统出错日志
* 5. 系统配置访问接口
* ...
* [单例主要应用于一个类只有一个实例]
* 单例模式发展.
* *. 经典的单例模式
* 同步方法可以解决线程安全问题,但是同步方法开销会增大,为了整体系统的效率,尽量不要使用同步.
*
* private final Object startupShutdownMonitor = new Object();
* 在对象中声名一个最终对象进行锁定,这样Application一次就只能有一个方法进入.
* Struts如何实现单例:
* 点评:actions是一个HashMap实例,这里使用同步代码块的方法synchronized(actions)[注意:同步代码块比同步方法开销小]
* 当一个请求过来时[线程],这里使用了同步,每一次都从actions中得到对象.如果不为空,则返回,如果为空则通过反映生成对象并返回.
* 这其实也属于单例注册.
* 上面介绍了Spring对应多个配置文件时用的同步,Struts的核心Action的同步,下面介绍一个Spring的核心Bean是如何实现单例的.
*
* Return the (raw) singleton object registered under the given name,
* creating and registering a new one if none registered yet.
* 细心的读者会发现,Struts和Spring都是采用单例注册器的方式实现的.
* private final Map singletonObjects = CollectionFactory.createConcurrentMapIfPossible(16);
* 这里根据你的jdk版本判断使用哪种同步Map
* if JDKVersion>JAVA_15[或者包括edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap]
* new ConcurrentHashMap(initialCapacity)
* else
* Collections.synchronizedMap(new HashMap(initialCapacity));
* 如果单例注册器中没有此对象* 1. beforeSingletonCreation(beanName); //监视创建对象前 * 2. singletonObject = singletonFactory.getObject();//返回对象 *singletonFactory.getObject();这是接口方法,这个接口由程序在调用的时候实现. *getSingleton(beanName, new ObjectFactory() {public Object getObject() throws BeansException {try {return createBean(beanName, mbd, args);//创建方法就是在子类要重写的}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}} }); * 3.afterSingletonCreation(beanName);//监视创建对象后 * 4.addSingleton(beanName, singletonObject);//添加对象到singletonObjects * 5.返回该对象. * 综上所述:在应用于系统资源时,为了提供同一接口,需要同步信息,但是Struts和Spring都使用了代码块同步,我们写程序的时候也要向 * 那些大师学习,尽量同步代码块. * */ }