单例模式

单例模式是保证一个类只有一个实例,并且提供一个全局访问的能力。

1)饿汉模式

public class Singleton {
private static Singleton instance = new Singleton();

//构造器私有化,防止外部实例化
private Singleton(){}

public static Singleton getInstance()
{
    return instance ;
}
}

在类加载的时候就做了静态初始化,提供一个全局的静态方法,不会涉及多线程调用的问题,简单而美好,但是如果没有调用则会造成资源的消耗,之所以叫饿汉,是因为还没有用到就已经加载了,这也是饿汉的由来。

2)懒汉模式

public class Singleton {
private static Singleton instance ;

//构造器私有化,防止外部实例化
private Singleton(){}

public static synchronized Singleton getInstance(){

    if (instance==null){
        instance = new Singleton();
    }

    return instance;
}
}

只有在第一次初始化时,才会初始化类,而且加了synchronized,保证线程的安全。问题是每次调用都需要synchronized,造成了资源浪费,之所以叫懒汉也是因为需要的时候才加载。

3)静态内部类单例模式

public class Singleton {
private Singleton(){}

public static Singleton getInstance(){
    return SingletonHolder.instance;
}

private static class SingletonHolder{
    private static final Singleton instance = new Singleton();
}
}

这也是终极单例了,第一次加载Singleton 类并不会初始化instance,因为静态内部类的加载都是在调用的时候加载的。只有在上面例子的getInstance被调用的时候,才会做第一次的初始化,这也就避免了多线程调用的线程安全问题,为什么要用静态的类呢,非静态的也是在调用的时候加载,因为保证调用后的静态唯一性。这也是真正的简单而美好。

你可能感兴趣的:(单例模式)