Java单例模式

Java单例模式

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

解决:一个全局使用的类频繁地创建与销毁。

使用:当您想控制实例数目,节省系统资源的时候。

解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键:构造函数是私有的。

 

优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

      2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

代码示例

1、懒汉模式

/**
 * 懒汉式:线程不安全
 * @author 943567518@qq.com
 *
 */
public class SingletonA1 {

    /*
     * 私有静态变量
     */
    private static SingletonA1 instance;
    
    /**
     * 空构造方法
     */
    private SingletonA1(){}
    
    /**
     * 获取实例
     * @return
     */
    public static SingletonA1 getInstance(){
        if(instance==null){
            instance=new SingletonA1();
        }
        return instance;
    }
    
}
/**
 * 懒汉式:线程安全
 * @author 943567518@qq.com
 *
 */
public class SingletonA2 {
    /*
     * 私有静态变量
     */
    private static SingletonA2 instance;
    
    /**
     * 空构造方法
     */
    private SingletonA2(){}
    
    /**
     * 获取实例-加锁
     * @return
     */
    public static synchronized SingletonA2 getInstance(){
        if(instance==null){
            instance=new SingletonA2();
        }
        return instance;
    }
}

2、饿汉模式

/**
 * 饿汉式:线程安全
 * @author 943567518@qq.com
 *
 */
public class SingletonB {
    /*
     * 私有静态变量
     */
    private static SingletonB instance=new SingletonB();
    
    /**
     * 空构造方法
     */
    private SingletonB(){}
    
    /**
     * 获取实例
     * @return
     */
    public static SingletonB getInstance(){
        return instance;
    }
}

3、双重检验

/**
 * 双重检验:线程安全
 * @author 943567518@qq.com
 *
 */
public class SingletonC {
    /*
     * 私有静态变量
     */
    private static volatile SingletonC instance;
    
    /**
     * 空构造方法
     */
    private SingletonC(){}
    
    /**
     * 获取实例
     * @return
     */
    public static SingletonC getInstance(){
        if(instance==null){
            synchronized(SingletonC.class){
                if(instance==null){
                    instance=new SingletonC();
                }
            }
        }
        return instance;
    }
    
}

4、静态内部类

/**
 * 静态内部类:线程安全
 * @author 943567518@qq.com
 *
 */
public class SingletonD {
    
    private SingletonD(){}
    
    public static SingletonD getInstance(){
        return SingletonInner.INSTANCE;
    }
    
    /**
     * 内部类
     * @author Administrator
     *
     */
    private static class SingletonInner{
        private static final SingletonD INSTANCE=new SingletonD();
    }
}
原文地址:https://www.cnblogs.com/xmqa/p/8631679.html