每日一题 为了工作 2020 0415 第四十四题

*单例设计模式

/**
 * 单例设计模式
 * 单例模式便是创建型设计模式的一种,它确保某一个类在系统中只有一个实例,并自行实例化,
 * 同时向外部提供获取这个唯一实例的接口。从这段描述中,我们不难可以得到单例模式的三大特性:
 * 1.单例类只有一个实例。
 * 2.单例类必须自己实例化自己。
 * 3.单例类需要向外提供实例。
 * 实现一:立即加载 <==>“饿汉模式”
 * 立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。
 * 很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。
 * “饿汉模式”的优缺点:
 * 优点:实现起来简单,没有多线程同步问题。
 * 缺点:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,
 * 从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,
 * 静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
 */
public class Singleton {
     //将自身对象实例化为一个属性 并利用static,final修饰
    private static final Singleton instance = new Singleton();
     //构造方法私有化
    private Singleton(){}
    //利用静态方法返回实例
    public static Singleton getInstance(){
        return Singleton.instance;
    }
}

  

/**
 * 单例构造模式
 * 实现二:延迟加载 / “懒汉模式”
 *
 * 延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。
 * 不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。
 *“懒汉模式”的优缺点:
 * 优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并
 * 分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些
 * 特定条件下会节约了内存。
 * 缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
 */
public class SingletonTwo {
    //将自身实例化对象设置为一个属性,并利用static修饰
    private static SingletonTwo instanceTwo;
    //构造方法私有化
    private SingletonTwo(){}
    //利用静态方法返回该类的实例化对象
    public static SingletonTwo getInstanceTwo(){
//        线程不安全
//        if (instanceTwo == null){
//            instanceTwo = new SingletonTwo();
//        }
//        return instanceTwo;
//        线程安全
        if (instanceTwo == null){
            //加锁
            //某个线程取得了类锁,实例化对象第二次检查instancdTwo的时候
            //查看该类是否已经被实例化出来了,如果没有最终进行类的实例化
            synchronized (SingletonTwo.class){
                if (instanceTwo == null){
                    instanceTwo = new SingletonTwo();
                }
            }
        }
        return instanceTwo;
    }
}

  

原文地址:https://www.cnblogs.com/walxt/p/12708736.html