关于单例模式

public class Singleton {


    private static Singleton singleton;


    private Singleton(){

    }


    public static Singleton getInstance() {

        if (null == singleton) {

            singleton = new Singleton();

        }

        return singleton;

    }


}

代码一在类创建的同时就并没有建好一个静态的对象供系统使用,并且线程不安全。


public class Singleton {


    private static Singleton singleton;


    private Singleton(){

    }


    public static Singleton getsychronizedInstance() {

        if (null == singleton) {

            synchronized (Singleton.class) {

                singleton = new Singleton();

            }

        }

        return singleton;

    }


}

代码二在类创建的同时就并没有建好一个静态的对象供系统使用,但是线程安全。


public class Singleton {


    private static Singleton singleton = new Singleton();


    private Singleton(){

    }


    public static Singleton getsychronizedInstance() {

        return singleton;

    }


}

代码三在类创建的同时就已经建好一个静态的对象供系统使用,因此也线程安全。


问题:

饿汉模式和懒汉模式是从线程安全角度来区分?还是从初始化类的时候是否实例化静态对象?来区分的。另外在英文版的设计模式中懒汉模式和饿汉模式对应的英文术语是怎么样的?


慕妹3242003
浏览 426回答 7
7回答

慕少森

如果要对存在序列化传输的要求的话,这个就有问题了,因为一个已经序列化的对象,反序列化的时候会重新生成一个对象。(违法了单例)public class Singleton implements Serializable{    private static Singleton singleton;    private Singleton(){    }    public static Singleton getInstance() {        if (null == singleton) {            synchronized (Singleton.class) {                if(null == singleton)                    singleton = new Singleton();            }        }        return singleton;    }    private Object readResolve() {           return INSTANCE;    }   }上面的代码变得好复杂,所以最好的单例是采用枚举实现。public enum Singleton{    INSTANCE;    public Singleton getInstance(){        return Singleton.INSTANCE;    }}

一只斗牛犬

public class Singleton {    private static Singleton singleton;    private Singleton(){    }    public static Singleton getsychronizedInstance() {        if (null == singleton) {            synchronized (Singleton.class) {                if(null == singleton)                    singleton = new Singleton();            }        }        return singleton;    }}

FFIVE

是从类加载时是否实例化对象来区分的

慕慕森

饿汉模式和懒汉模式是实例是否实例化来区分的可以参考我的博客:单例模式(Singleton)

30秒到达战场

我一般使用内部类实现
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java