zoukankan      html  css  js  c++  java
  • 《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)
  • 相关阅读:
    <img/>标签onerror事件在IE下的bug和解决方法
    IIS启用Gzip压缩造成OpenFlashChart不能正常显示问题及解决方法
    小心枚举陷阱
    "动软.Net代码生成器"的一次扩展经历
    旁听面试杂想
    .NET Remoting学习点滴(二):基本概念
    十字路口
    表变量和临时表
    动态创建WebService
    拼接SQL造成的意想不到的后果
  • 原文地址:https://www.cnblogs.com/-1307/p/6439938.html
Copyright © 2011-2022 走看看