单例模式六种常见形式

* 饿汉式:直接创建对象,不存在现场安全问题。

  1. 直接实例化饿汉式(简洁直观)

    1. /**
    2. * 饿汉式
    3. * 直接创建实例对象,不管你是否需要这个对象
    4. *
    5. * (1)构造器私有化
    6. * (2)自行创建,并且用静态变量保存
    7. * (3)向外提供这个实例
    8. * (4)强调这是一个单例,并用final修饰
    9. */
    10. public class Singleton1 {
    11. public static final Singleton1 INSTANCE = new Singleton1();
    12. private Singleton1(){
    13. }
    14. }
  1. 枚举式(最简洁)
    1. /**
    2. * 枚举类型:表示该类型的对象是有限的几个
    3. * 我们可以限定为一个,就成了单例
    4. */
    5. public enum Singleton2 {
    6. INSTANCE
    7. }
  1. 静态代码块饿汉式(适合复杂实例化)

    1. public class Singleton3 {
    2. private static final Singleton3 INSTANCE;
    3. static {
    4. INSTANCE = new Singleton3();
    5. }
    6. private Singleton3(){
    7. }
    8. }

* 懒汉式:延迟创建对象

  1. 线程不安全(适用于单线程)

    1. /**
    2. * 懒汉式:
    3. * 延迟创建这个实例对象
    4. * (1)构造器私有化
    5. * (2)用一个静态变量保存这个唯一的实例
    6. * (3)提供一个静态方法,获取这个实例对象
    7. */
    8. public class Singleton4 {
    9. private static Singleton4 instance;
    10. private Singleton4(){
    11. }
    12. public static Singleton4 getInstance(){
    13. if (instance == null){
    14. instance = new Singleton4();
    15. }
    16. return instance;
    17. }
    18. }
  1. 线程安全(适用于多线程):加锁

    1. /**
    2. * 懒汉式:
    3. * 延迟创建这个实例对象
    4. * (1)构造器私有化
    5. * (2)用一个静态变量保存这个唯一的实例
    6. * (3)提供一个静态方法,获取这个实例对象
    7. */
    8. public class Singleton5 {
    9. private static Singleton5 instance;
    10. private Singleton5(){
    11. }
    12. public static Singleton5 getInstance(){
    13. synchronized (Singleton5.class) {
    14. if (instance == null) {
    15. instance = new Singleton5();
    16. }
    17. return instance;
    18. }
    19. }
    20. }
  1. 静态内部类形式(适用于多线程) ```java

/**

  • 在内部类被加载和初始化时,才创建INSTANCE实例对象
  • 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的。
  • 因为是在内部类加载和初始化时,创建的,因此是线程安全的 */ public class Singleton6 { private Singleton6() {

    } private static class Inner{

    1. private static final Singleton6 INSTANCE = new Singleton6();

    } public static Singleton6 getInstance() {

    1. return Inner.INSTANCE;

    } } ```