单例模式是设计模式的一种,属于创建型模式。这种模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

     一.单例的实现主要是通过以下两个步骤

  1. 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;

  2. 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

      二.单例模式在实现上有饿汉模式和懒汉模式。

1.饿汉模式:在自己被加载时就将自己实例化,好比在做一件事的时候我们会事前做好一切准备工具以及策略方法,全盘托出。避免了线程同步问题,但是需要提前占用系统资源,造成内存浪费。

2.懒汉模式:当在使用的时候才会将自己实例化,好比兵来将挡水来土掩,只有一件事该要发生的时候才会做准备。懒汉模式会面临多线程访问的安全性问题,需要做双重锁定才能保证安全。

三.双重锁定:(Double—Check Locking)

设计模式—单例模式

当多个线程时,同时访问singleton类,调用 GetInstance()方法,可能会造成多个实例,这时需要加一把锁(lock:确保一个线程位于临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定代码,将一直等待,直到该对象释放)。

双重锁定是不让线程每次都加锁,只是在实例未创建的时候再加锁处理,同时也能保证多线程的安全。

进行两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。

使用双重检测同步延迟加载去创建单例的做法是一个非常优秀的做法,其不但保证了单例,而且切实提高了程序运行效率

相关文章: