java单例的实现方式

饿汉模式

//普通员工
public class Staff {
    public void work() {
        //干活
    }
}

//副总裁
public class VP extends Staff {
    @Override
    public void work() {
        //管理下面的经理
    }
}

//CEO,饿汉单例模式
public class CEO extends Staff {
    private static final CEO mCeo = new CEO();
    //构造函数私有
    private CEO() {
    }
    //共有的静态函数,对外暴露获取单例对象的接口
    public static CEO getCeo(){
        return mCeo;
    }

    @Override
    public void work(){
        //管理VP
    }
}

CEO类不能通过new的形式构造对象,只能通过CEO.getCEO()函数获取,而这个CEO对象是静态对象,并且在声明的时候就已经初始化了,这就保证了CEO对象的唯一性。

懒汉模式

懒汉模式是声明一个静态对象,并且在用户第一次调用getInstance时进行初始化,而上述的饿汉模式是在声明静态对象时就已经初始化。

public class Singleton {
    private static Singleton instance;
    private Singleton (){
    }
    public static synchronized Singleton getInstance(){
        if (instance == null){
            instance=new Singleton();
        }
        return instance;
    }
}

懒汉模式下,getInstance()方法中添加了synchronized关键字,使得getInstance()成为一个同步方法,这就保证单例对象在多线程情况下的唯一性。
缺点:第一次加载时需要及时进行实例化,反应稍慢,最大的问题是每次调用getInstance()都进行同步,造成不必要的同步开销。一般不建议使用。

Double Check Lock (DCL) 实现单例

public class Singleton {
    private static Singleton mInstance=null;
    private Singleton(){
    }
    public void doSomething(){
        System.out.println("do sth.");
    }
    public static Singleton getInstance(){
        if(mInstance==null){
            synchronized (Singleton.class){
                if(mInstance==null){
                    mInstance=new Singleton();
                }
            }
        }
        return mInstance;
    }
}

静态内部类单例模式

public class Singleton {
    private Singleton() { }
    public static Singleton getInstance() {
        return SingletonHolder.sInstance;
    }
    /**
    *  静态内部类
    */
    private static class SingletonHolder {
        private static final Singleton sInstance = new Singleton();
    }
}
推荐使用静态内部类方法实现单例

枚举单例

public enum SingletonEnum {
    INSTANCE;
    public void doSomething(){
        System.out.println(" do sth.");
    }
}

使用容器实现单例

public class SingletonManager {
    private static Map objMap = new HashMap();
    private SingletonManager() { }
    public static void registerService(String key,Object instance) {
        if (!objMap.containsKey(key)){
            objMap.put(key,instance);
        }
    }
    public static Object getService(String key) {
        return objMap.get(key);
    }
}

你可能感兴趣的:(java单例的实现方式)