设计模式读书笔记(一)单例模式

来源:互联网 发布:金融工程硕士就业 知乎 编辑:程序博客网 时间:2024/04/28 12:33

本文为我最近学习看书时候的笔记和自己的部分理解,如果有什么错误请不吝指正。

单例就是指一个类只有一个惟一的实例。有时候在程序执行中并不需要new 那么多的同一个类的那么多实例,可以用单例模式来节省新建一个实例的开支。数据库连接池就是一种单例模式的应用。

单例模式的两种形式:饿汉式和懒汉式。

饿汉式:

package singleton;/*饿汉式 */public class Singleton {private static Singleton instance = new Singleton();// instance必须是staticprivate Singleton() {// 构造函数// 注意 即使构造函数为空也要有一个权限为private的构造函数// 防止直接用构造函数而构造多个实例}public static Singleton getInstance() {return instance;}}
懒汉式:

package singleton;/*饿汉式 */public class Singleton {private static Singleton instance = new Singleton();// instance必须是staticprivate Singleton() {// 构造函数// 注意 即使构造函数为空也要有一个权限为private的构造函数// 防止直接用构造函数而构造多个实例}public static Singleton getInstance() {return instance;}}
要用到Singleton的一个实例时,只要在代码中用 Singleton s=Singleton.getInstance() 就可以获取到实例了。由于是单实例,在整个程序中调用的是同一个实例,因此可以认为该实例中的属性是一个跨越多个实例多个线程的全局变量。

显然懒汉式和饿汉式的差别是instance是否在一开始就已经构造好了。懒汉式在程序执行一开始已经构造了实例。饿汉式会在需要的时候再去构造。


在多线程中使用的单例模式:双检测锁机制的单例模式

在多线程中使用懒汉式构造单例显然会发生这种问题:多个线程同时在判断if(instance==null),导致产生了多个该类的实例,因此要使用synchronized(同步)机制。(书上这么写的,但是关于这部分我有问题,由于instance是静态变量,如何同时让一个静态instance指向多个实例生成多个实例这一点确实不太明白)


双检测锁机制的单例模式(懒汉式):代码如下

package singleton;/*双检测锁机制的单例模式*/public class SingletonSyn {private static SingletonSyn instance = null;private SingletonSyn() {// ......}private static SingletonSyn getInstance() {if (instance == null) {synchronized (SingletonSyn.class) {if (instance == null) {instance = new SingletonSyn();//两个instance==null的判断必不可少}}}return instance;}}
这种写法在第一次创建实例时才进入synchronized机制,满足了在多线程下单线程模式的应用。

值得注意的是饿汉式的单实例模式可以直接应用在多线程下。原因是在一开始实例已经新建好了。


原创粉丝点击