单例模式之懒汉与饿汉
程序员文章站
2022-07-14 09:39:32
...
懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。
饿汉模式:
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。
static class Singleton {
//1.将构造方法设置成私有的
private Singleton() {}
//2.创建一个静态的类变量
private static final Singleton singleton = new Singleton();
//3.给外部提供获取单例的方法
public static Singleton getInstance() {
return singleton;
}
懒汉模式:
懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
public class ThreadSingleleton {
static class Singleton {
//1.无参构造方法
private Singleton() {}
//2.创建静态的类变量 用于返回参数
private static volatile Singleton singleton = null;
//3.给外部提供获取单例的方法
public static Singleton getInstance() {
//双重校验锁
if(singleton == null) {
synchronized (Singleton.class) {
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
总结:
从上面两个代码来看,由于懒汉模式下,每次获取实例都需要判断,如果使用非常频繁的时候,这种方式性能肯定有所下降。 因此懒汉模式下,不适合使用太频繁的对象。
饿汉是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变而在饿汉模式下,不管是否用到,都会初始化实例。