设计模式之单例模式

来源:互联网 发布:origin多组数据作图 编辑:程序博客网 时间:2024/06/06 02:23

1. 单例模式概述

单例模式用于创建一个实例的场景,例如线程池、常量池,Spring上下文等等

2. 单例模式关键点

  • 构造函数私有
  • 声明静态成员变量存储实例
  • 对外提供获取实例的方法

3. 最简单的单例模式

    public class SimpleSingleton{        private SimpleSingleton(){}//私有构造函数        private static SimpleSingleton instance = new SimpleSingleton();        public static SimpleSingleton getInstance(){            return instance;        }    }

这种方式实现的单例是线程安全的,当有多个线程去调用getInstance()方法时,不会创建多个对象,因为JVM在加载该类时,对于static修饰的静态属性,只能由一个线程执行,且只执行1次。
但是在分布式系统中,每台服务器都有一个JVM,该方式不适用。
最简单的方式实现在类加载时就初始化实例,若想要实现在调用时初始化实例,则可以使用Double-check locking的方式实现。

4. 延迟创建的单例

    public class Singleton{    private Singleton(){}    private volatile static Singleton instance = null;    public static Singleton getInstance(){        if(instance == null){            synchronized(Singleton.class){                if(instance == null){                instance = new Singleton();                }            }        }        return instance;    }}

之所以判断两次,是因为ThreadA和ThreadB同时调用该方法时,都判断为空,在等待进入同步代码块,如果ThreadA先进入,实例化了一个对象,在同步代码块中不再次判断的话,ThreadB也将创建一个对象。
成员变量使用volatile关键字修饰,表示在ThreadA实例化对象后,其他线程能够自动发现instance变量的最新值。

对于分布式系统中实现单例待补充。
不知道参考了许多人家的博客写出的东西是转载还是原创,那就先设成转载吧!好好写每一篇博客。

0 0
原创粉丝点击