JAVA 单例模式( Singleton )

设计模式

参见:https://www.malaoshi.top/show_1EF2G0eIdaD3.html

单例模式

参见:https://www.malaoshi.top/show_1EF2G0eIdaD3.html

饿汉式 PK 懒汉式

1 、饿汉式在类加载时就创建实例, 第一次加载速度快; 懒汉式第一次使用时才进行实例化,第一次加载速度慢 饿汉式:空间换时间 懒汉式:时间换空间
2 、饿汉式线程安全;懒汉式存在线程风险

饿汉式(最简单)

创建对象实例的时候直接初始化
空间换时间
线程安全

public class SingletonHungary  {
    //1、创建类中私有构造
    private SingletonHungary (){

    }

    //2、创建该类型的私有静态实例
    private static SingletonHungary  instance=new SingletonHungary ();

    //3、创建公有静态方法返回静态实例对象
    public static SingletonHungary  getInstance(){
        return instance;
    }
}

懒汉式

类内实例对象创建时并不直接初始化,直到第一次调用get方法时,才完成初始化操作
时间换空间
线程不安全

public class SingletonLazy {
    //1、创建私有构造方法
    private SingletonLazy(){

    }

    //2、创建静态的该类实例对象
    private static SingletonLazy instance=null;

    //3、创建开放的静态方法提供实例对象
    public static SingletonLazy getInstance(){
        /*
        第一次调用时,instance为null,才创建对象
        以后再调用,instance不为null,不创建对象,直接返回
         */
        if(instance==null)
            instance=new SingletonLazy();

        return instance;
    }
}

静态内部类(最优)

和饿汉模式一样,是靠JVM保证类的静态成员只能被加载一次的特点,这样就从JVM层面保证了只会有一个实例对象。

线程安全

class SingletonStaticInner {
    private SingletonStaticInner() {

    }
    private static class SingletonInner {
        private static SingletonStaticInner singletonStaticInner = new SingletonStaticInner();
    }
    public static SingletonStaticInner getInstance() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return SingletonInner.singletonStaticInner;
    }
}

与饿汉模式区别

加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
可以说这种方式是实现单例模式的最优解。

真实应用

JDK中的 Runtime 类

练习

多选题 单例模式的实现必须满足()个条件。(选择三项)

A 类中的构造方法的访问权限必须设置为私有的
B 类中的构造方法必须用protected修饰
C 必须在类中创建该类的静态私有对象
D 在类中提供一个公有的静态方法用于创建、获取静态私有对象

多选题 下列关于懒汉式和饿汉式的说法错误的是()(选择两项)
A 饿汉式在第一次使用时进行实例化
B 懒汉式在类加载时就创建实例
C 饿汉式的线程是安全的
D 懒汉式存在线程风险
编程练习 某公司研发星球维护系统,请使用饿汉式单例模式的实现思想,设计编写地球类。


原文出处:/show_1EF4rpebxXU2.html