《Head First 设计模式》之单件模式

单件模式(Singleton)

  ——确保一个类只有一个实例,并提供全局访问点。

  有一些对象其实我们只需要一个,比如线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象。如果制造出多个实例,就会导致程序的行为异常、资源使用过量,或者不一致的结果等。

  • 要点
  1. 在Java中实现单件模式需要私有的构造器、一个静态方法和一个静态变量。
  2. 多线程问题。
 1 public class Singleton{
 2     private static Singleton uniqueInstance;//用一个静态变量记录Singleton类的唯一实例
 3     
 4     private Singleton(){}//构造器声明为私有的,只有Singleton类内才能调用
 5     
 6     public static Singleton getInstance(){//若我们不需要这个实例,它就永远不会产生。这就是“延迟实例化”(lazy instantiaze)
 7         if(uniqueInstance == null){
 8             uniqueInstance = new Singleton();
 9         }
10         return uniqueInstance;
11     }
12 }

处理多线程:

  • 同步getInstance()方法
1     //每个线程在进入这个方法之前,要先等候别的线程离开该方法。
2     public static synchronized Singleton getInstance(){
3         if(uniqueInstance == null){
4             uniqueInstance = new Singleton();
5         }
6         return uniqueInstance;
7     }
  • 急切实例化
 1 public class Singleton{
 2     //在静态初始化器(static initializer)中创建单件。保证了线程安全(thread safe)。
 3     private static Singleton uniqueInstance = new Singleton();
 4     
 5     private Singleton(){}
 6     
 7     public static Singleton getInstance(){
 8         return uniqueInstance;
 9     }
10 }//JVM保证在任何线程访问uniqueInstance静态变量之前,一定先创建此实例。
  • 双重检查加锁(double-checked locking)

 

    原文作者:D-Dong
    原文地址: https://www.cnblogs.com/-1307/p/6439938.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞