修炼Java开发技术,学习笔记:单例模式

很多时候,我们需要应用中只有一个该类的实例,例如一些全局计数器,如果实例不止一个,势必造成冲突错误。实现单例,在客户程序端可以实现的办法,可以是做一些“Try-Use”的工作,如果有,拿来用,如果没有,创建一个。但是这样的方式,对客户端来说,管理混乱,封装性不好,也不安全。因此,通常是使用在类加载的时候,就实现单例的目的。
当然,单例也有它的作用范围,目前Java中一个单例的范围是一个ClassLoader及其子ClassLoader的范围。如果虚拟机中存在多个ClassLoader都装载了相同的单例类,就算这是个单例类,势必会产生多个实例,更不用说一台机器上存在多个虚拟机的情况,以及更复杂的集群,多核技术下产生的分布式计算环境中的情况。因此,这里所说的单例,通常值得是同一个ClassLoader中的情况。

1. 恶汉式

public class Singleton{
    //3:类加载时,第一时间创建好一个本类实例,所以称为“恶汉式”
    private static Singleton instance = new Singleton();
    //1:私有化构造方法,不让外部创建实例;
    private Singleton(){}
    //2:向外部提供一个类方法接口,获取唯一的实例;
    public static Singleton getInstance(){
        return instance;
    }
}

2. 懒汉式

对于资源密集,配置开销大的单例,更适合的做法是将实例化工作推迟到使用它的时候,而不是类刚加载就完成。也就是说对于那些需要使用大量数据的单例,可以考虑惰性加载(Lazy Loading)。也就是所谓的懒汉式:

public class Singleton{
    //3:这里的static是主动被动加上的,因为需要在静态方法getInstance()中被使用,这一点和恶汉式,需要类加载时创建实例而使用static是不同的
    private static Singleton instance = null;
    //1:同样,私有化构造方法
    private Singleton(){}
    //2:对外提供获取单例的接口,public static修饰
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
            return instance;
        }
        return instance;
    }
}

3. 使用实例及拓展

你可能感兴趣的:(java,技术)