修炼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. 使用实例及拓展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值