设计模式学习之单例模式

设计模式


单例模式是比较简单的,用处非常广泛,最近学习mybatis,其底层好多用的就是单例模式,比如其中的一个组件SqlSessionFactory的创建就是用单例模式处理的。再比如数据库连接池,日志管理,等,都会用到单例,总结起来就是,当程序运行时,需要保证一个对象只有一个实例存在,就会用到单例模式。单例模式解决的核心问题就是:一个类下可以创建多个对象而导致的浪费内存的问题。先看一段代码:

/*JDK自带的Runtime类,主要可以获取当前的jvm虚拟内存,运行垃圾回收等,也就是通过这个类可以获得与jvm运行环境相关的一些信息,这里我们不过多地纠结这个类本身,下面是部分源代码*/
public class Runtime {
//这里定义了这个类本身的一个实例,static类型
     private static Runtime currentRuntime = new Runtime();
     //定义一个静态方法,用来获取静态实例
     public static Runtime getRuntime() {
         return currentRuntime;
}

//将构造方法声明为private类型,防止在类外进行实例化,从而确保单例
     private Runtime() {}
...
}

单例模式实现的方法很简单,1.定义一个该类的静态变量,2.定义一个获取该静态变量的静态方法,3.将构造方法私有化 模板如下:

public class Singleton{
    private static Singleton singleton = new Singleton();
    //饿汉模式在类加载时就创建实例
    private Singleton(){};
    public static Singleton getSingleton(){
        return this.singleton;
    }

}

这种模式被称为饿汉式单例模式。下面看另外一种,被称为懒汉式单例模式

public class Singleton {
    private static Singleton singleton = null;
    private Singleton(){};
    public static Singleton getSingleton(){
        if(singleton==null){//懒汉模式只有在需要获取时创建
            singleton = new Singleton();
        }
        return singleton;
    }
}

下面我们考虑在多线程环境下,当多个线程都进行if判断时,就会产生多个实例,我们可以下面这种加双重锁的方法实现多线程环境下的单例。

public class Singleton {
    private static Singleton singleton = null;
    private Singleton(){};
    public static Singleton getSingleton(){
        if(singleton==null){
            synchronized (Singleton.class) {//static方法用类的class对象当锁
                if(singleton==null){//这里如果不进行判断,仍然会产生多线程产生多个实例的问题
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值