java - 关于单例模式

查看:127
本文介绍了java - 关于单例模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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;
    }

}

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

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

解决方案

@k袁_cn 分析得很清楚。

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

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;
    }
}

这篇关于java - 关于单例模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆