java基础之-单列模式-Singleton

单例模式的作用:

/**
*  单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
*
*1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
*
*2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
*
* 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。
*(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
*/


懒汉式单例

何为懒汉式单例呢,可以这样理解,单例模式呢,其在整个应用程序的生命周期中只存在一个实例,

懒汉式呢,就是这个单例类的这个唯一实例是在第一次使用 GetInstance()时实例化的,

如果您不调用 GetInstance()的话,这个实例是不会存在的,即为 null

形象点说呢,就是你不去动它的话,它自己是不会实例化的,所以可以称之为懒汉。

其实呢,我前面在介绍单例模式的这几个 Demo 中都是使用的懒汉式单例,

看下面的 GetInstance()方法就明白了:

   
    public static Singleton GetInstance() 
        { 
            if (singleton == null) 
            { 
                lock (syncObject) 
                {

                    if (singleton == null) 
                    { 
                        singleton = new Singleton(); 
                    } 
                } 
            } 
            return singleton; 
        }

从上面的这个 GetInstance()中可以看出这个单例类的唯一实例是在第一次调用 GetInstance()时实例化的,

所以此为懒汉式单例。

              

           

饿汉式单例

上面介绍了饿汉式单例,到这里来理解懒汉式单例的话,就容易多了,懒汉式单例由于人懒,

所以其自己是不会主动实例化单例类的唯一实例的,而饿汉式的话,则刚好相反,

其由于肚子饿了,所以到处找东西吃,人也变得主动了很多,所以根本就不需要别人来催他实例化单例类的为一实例,

其自己就会主动实例化单例类的这个唯一类。

在 C# 中,可以用特殊的方式实现饿汉式单例,即使用静态初始化来完成饿汉式单例模式

下面就来看一看饿汉式单例类

namespace Singleton 
{ 
    public sealed class Singleton 
    { 
        private static readonly Singleton singleton = new Singleton();

        private Singleton() 
        { 
        }

        public static Singleton GetInstance() 
        { 
            return singleton; 
        } 
    } 
}


要先在这里提一下的是使用静态初始化的话,无需显示地编写线程安全代码,

C# 与 CLR 会自动解决前面提到的懒汉式单例类时出现的多线程同步问题。

上面的饿汉式单例类中可以看到,当整个类被加载的时候,就会自行初始化 singleton 这个静态只读变量。

而非在第一次调用 GetInstance()时再来实例化单例类的唯一实例,所以这就是一种饿汉式的单例类。


备注:

一、单例模式是用来实现在整个程序中只有一个实例的。

二、单例类的构造函数必须为私有,同时单例类必须提供一个全局访问点。

三、单例模式在多线程下的同步问题和性能问题的解决。

四、懒汉式和饿汉式单例类




参考的文章地址:

http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html?login=1

猜你喜欢

转载自lfc-jack.iteye.com/blog/2331613
今日推荐