☺ 对于单例模式,个人学习需要掌握

  • 注意答案的重点标黑了。对于单例模式,掌握,我下面这几点就很棒棒。



一、什么是单例模式:

在java中的定义是:一个类有且仅有一个实例,[单例],并且自行实例化向整个系统提供。

二、实现单例的步骤:

1、构造器私有化防止new,导致多个实例,而是在类内部创建对象

2、向外暴露一个静态的公共方法 getInstance



三、单例的方式

■ 单例模式有八种方式:

饿汉式(静态常量/静态代码块)

懒汉式(线程不安全/线程安全,同步方法/线程安全,同步代码块)

双重检查

静态内部类

枚举


★ 饿汉式和懒汉式区别:

饿汉式:在类内部一开始初始化时就创建好实例,而懒汉式是需要用的时候才去创建实例



■ 饿汉式(静态常量/静态代码块)

/**
* 饿汉式(静态常量)
*/
public class Singleton{
    private static final Singleton singleton  = new Singleton();//饿汉式,初始化时就创建好了实例[使用了final常量-->饿汉式(静态常量)]

    private Singleton(){}//构造器私有化,防止new,导致多个实例

    public static Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        return singleton;
    }
}
/**
* 饿汉式(静态代码块)
*/
public class Singleton{
    private static Singleton singleton  = new Singleton();//饿汉式,初始化时就创建好了实例

    //代码块[使用了static代码块-->饿汉式(静态代码块)]
    static{
        singleton = new Singleton();
    }

    private Singleton(){}//构造器私有化,防止new,导致多个实例

    public static Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        return singleton;
    }
}

■ 懒汉式(线程不安全/ 线程安全,同步方法 / 线程安全,同步代码块)

□ 懒汉式(线程不安全)

public class Singleton{
    private Singleton(){}//构造器私有化,防止new,导致多个实例
    private static Singleton singleton;
    public static Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }

}


□ 懒汉式(线程安全,同步方法)

public class Singleton{
    private Singleton(){}//构造器私有化,防止new,导致多个实例
    private static Singleton singleton;
    //同步方法,synchronized直接加在方法上
    public static synchronized Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }

}

□ 懒汉式(线程安全,同步代码块)

public class Singleton{
    private Singleton(){}//构造器私有化,防止new,导致多个实例
    private static Singleton singleton;
    public static Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        if(singleton == null){
            //同步代码块,synchronized是单独作为代码块使用
            synchronized (Singleton.class){
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

■ 双重检查

public class Singleton{
    private Singleton(){}//构造器私有化,防止new,导致多个实例
    private static volatile Singleton singleton;
    public static Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        //第一层检查
        if(singleton == null){
            //同步代码块
            synchronized (Singleton.class){
                 //第二层检查
                if(singleton == null) {
                    singleton = new Singleton();
                }
            }

        }
        return singleton;
    }

}

■ 静态内部类

public class Singleton{
    private Singleton(){}//构造器私有化,防止new,导致多个实例
    //静态内部类,在其内部以静态常量的方式实例化对象
    private static class SingletonInstance{
        private static final Singleton singleton = new Singleton();//常量静态属性,实例化对象[初始化]
    }
    public static Singleton getInstance(){//向外暴露一个静态的公共方法  getInstance
        return SingletonInstance.singleton;
    }
}

■ 枚举方式

enum Singleton{
    INSTANCE;
    public void method(){
//            操作方法
    }

}



四、单例的使用场景

需要频繁的进行创建和销毁的对象、

创建对象时耗时过多或 耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)





如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

06-07 10:08