风扬  

Singleton 模式要求一个类有且仅有一个实例,并提供一个全局访问点。

Singleton模式 是一种职责型模式。因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责!

1.三种实现方式:饿汉式、懒汉式、IoDH,

 a.饿汉式在类加载时就进行实例化,无需考虑线程的操作,却占用容器,浪费资源

 b. 懒汉式 在静态方法中实例化,需要考虑多线程操作,需要加同步锁的状态

 c IoDH  定义一个内部类初始化对象  既能延迟初始化,又能保证线程安全,最优单例模式实现方式

2.主要应用场景

  windows 任务管理器、垃圾回收站、网页计数器、web配置初始化、数据源配置,线程池控制

3. 可能存在问题

  java的垃圾回收机制对长时间不用的系统会进行自动回收,会造成单例模式的状态丢失

public class EagerSingleClass {
private final EagerSingleClass eager = new EagerSingleClass();

private EagerSingleClass() {

}
/**
* 饿汉式单例模式在类加载时就初始化,不必考虑线程 ,但会占用容器,从资源利用角效率来讲不如懒汉式
* * @author Yang Xue 2014年12月2日
* @return
*/
public EagerSingleClass getInstance(){
return eager;
}


public EagerSingleClass getINstanceClass(){
return GetEagerSingle.eagerSingleClass;
}

/**
* Initialization on Demand Holder (IoDH)
* @author wb-yangxue.yx
* 实现延迟加载,又可保证线程安全,最优单例模式
* @version $Id: EagerSingleClass.java, v 0.1 2014年12月2日 上午10:46:24 wb-yangxue.yx Exp $
*/
private static class GetEagerSingle{
private static final EagerSingleClass eagerSingleClass=new EagerSingleClass();
}
}

 

 

public class LazySingleClass {
private volatile static LazySingleClass singleClass;

private LazySingleClass() {

}
/**
* 懒汉式双重锁定 同步里判断是为了避免多线程操作,双重锁定变量前需加volatile,
* volatile 会屏蔽虚拟机内所做的一些列优化,导致系统运行效率降低
* @author Yang Xue 2014年12月2日
* @return
*/
public static LazySingleClass getInstall() {
if (singleClass == null) {
synchronized (LazySingleClass.class) {
if (singleClass == null) {
singleClass = new LazySingleClass();
}
}
}
return singleClass;
}
}

 

posted on 2014-12-02 11:09  风扬扬  阅读(231)  评论(0编辑  收藏  举报