设计模式学习之单例模式

来源:互联网 发布:韩国实力知乎 编辑:程序博客网 时间:2024/05/17 22:06

设计模式


单例模式是比较简单的,用处非常广泛,最近学习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;    }}
原创粉丝点击