六种单例模式

原创
2016/04/13 11:20
阅读数 123

单例模式

单例模式、常用的设计模式之一,这里收集一些Java的实现。包括经典饿汉模式、经典懒汉模式、静态代码、静态内部类、DCL同步代码、枚举。其中涉及到了类的实例化、序列化与反序列化时类的新建。但是没有涉及​万能的反射。

###经典饿汉模式 不管会不会用到这个类,首先实例化,这就是饿的意思。

	public cclass Ehan implements Serializable{
    private static Ehan eh = new Ehan();

    private Ehan(){}

    public static Ehan getSingleton(){
        return eh;
    }

    protected Object readResolve() throws ObjectStreamException{
        return eh;
    }
}

###静态代码 饿汉模式的变种。

public class Jtai implements Serializable{
    private static Jtai jt;
    private Jtai(){}

    static {
        jt = new Jtai();
    }

    public static Jtai getSingleton(){
        return jt;
    }

    protected Object readResolve() throws ObjectStreamException{
        return jt;
    }
}

###静态内部类 饿汉模式的变种。

public class Neibu implements Serializable{
    static class Handle{
        private static Neibu nb = new Neibu();
    }

    private Neibu(){}

    public static Neibu getSingleton(){
        return Handle.nb;
    }

    protected Object readResolve() throws ObjectStreamException{
        return Handle.nb;
    }
}

枚举

也是饿汉的一种吧,优势明显,不但可以避免多线程同步问题,而且免去反序列化可能会重新创建对象的问题。

public enum Meiju{
    SINGLETON;
    public void doSomeThing(){}
}

经典懒汉模式

等到第一次调用的时候才实例化。

public class Lanhan implements Serializable{
    private static Lanhan lhan;
    private Lanhan(){}
    synchronized public static Lanhan getSingleton(){
        if (lhan == null){
            lhan = new Lanhan();
        }
        return lhan;
    }

    protected Object readResolve() throws ObjectStreamException{
        return lhan;
    }
}

DCL同步代码

方法内同步代码块,使用volatile保持singleton字段的多线程可见性。DCL是双锁检查,需要检查两次是因为在第一次ifsynchronized无法保证操作的原子性,在多线程情况下是不安全的,所有synchronized代码块中再一次用if判断。

class Doucl implements Serializable{
    private static Doucl dc;
    private Doucl(){}
    public static Doucl getSingleton(){
        if(dc == null){
            synchronized (Doucl.class){
                if(dc == null){
                    dc = new Doucl();
                }
            }
        }
        return dc;
    }

    protected Object readResolve() throws ObjectStreamException{
        return dc;
    }
}
展开阅读全文
打赏
1
7 收藏
分享
加载中
更多评论
打赏
0 评论
7 收藏
1
分享
返回顶部
顶部