java设计模式--単例模式的理解

本文介绍了单例模式的概念及其应用场景,探讨了单例模式为何能够控制实例数目并节省系统资源。文章详细对比了懒汉式(lazyloading)和饿汉式(eagerloading)两种实现方式,包括它们的线程安全性和内存消耗特点。

単例模式

単例模式:就是一个类只有一个实例。


  • 为什么需要単例模式呢?

何时使用:当您想控制实例数目,节省系统资源的时候。比如:一个党只有一个主席
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

if(instance==null){
return new singleton;
}
else{
return instance;
}

关键代码:构造函数是私有的。

代码实现

  • 方式1(lazy loading,线程同步)
    在介绍lazy loading之前,先要介绍对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
    为什么强调初始化呢,比方说下面的这段代码
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
} 

这就是滞后式,也就是lazy loading,因为他只是声明了静态实例,并没有为其开辟内存,也就是并没有用构造方法去构造他。
static的变量是在类装载的时候就会被初始化,即,只要类被装载,不管是否使用了static变量,都会被初始化。

  • 方式2(eager loading,线程同步)
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}  

这个在类加载的时候,就进行了instance的初始化,比较耗费内存。不过,线程是安全的,因为初始的情况就已经定义好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值