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)
  • 相关阅读:
    Asp.Net图片上传
    JQuery实现CheckBox全选全不选
    DES加密解密公用方法(详细注释)
    sysobjects
    window.onload和$(document).ready()区别
    Ajaxpro2 实现三级联动
    idea Mac版过期处理方法.适用于JetBrains全家桶
    rabbitmq报错Failed to start RabbitMQ broker
    pip install image 失败,加上国内源
    关于系统程序员的一些感悟
  • 原文地址:https://www.cnblogs.com/-1307/p/6439938.html
Copyright © 2011-2022 走看看