为了账号安全,请及时绑定邮箱和手机立即绑定

关于单例模式

关于单例模式

慕妹3242003 2019-03-14 14:15:26
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;    }}代码三在类创建的同时就已经建好一个静态的对象供系统使用,因此也线程安全。问题:饿汉模式和懒汉模式是从线程安全角度来区分?还是从初始化类的时候是否实例化静态对象?来区分的。另外在英文版的设计模式中懒汉模式和饿汉模式对应的英文术语是怎么样的?
查看完整描述

7 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

如果要对存在序列化传输的要求的话,这个就有问题了,因为一个已经序列化的对象,反序列化的时候会重新生成一个对象。(违法了单例)


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;

    }

}


查看完整回答
反对 回复 2019-04-22
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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;

    }


}


查看完整回答
反对 回复 2019-04-22
?
FFIVE

TA贡献1797条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-04-22
?
慕慕森

TA贡献1856条经验 获得超17个赞

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

查看完整回答
反对 回复 2019-04-22
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

我一般使用内部类实现


查看完整回答
反对 回复 2019-04-22
  • 7 回答
  • 0 关注
  • 425 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号