zoukankan      html  css  js  c++  java
  • 单例模式

    昨天笔试考到了单例模式,现在重新总结一下吧。

    一、什么是单例模式

      单例模式是一种对象创建型模式,使用单例模式,可以保证一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

      其实,gof对单例模式的定义是:保证一个类只有一个实例存在,同时提供能够对该实例加以访问的全局访问方法。

    二、为什么要使用单例模式

      在应用系统开发中,我们常常有一下需求:

      1.在多个线程之间,比如servlet环境,共享统一个资源或者操作统一个对象

      2.在整个程序空间使用全局变量,共享资源

      3.大规模系统中,为了性能的考虑,需要节省对象的创建时间等。

      因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。

    三、单例模式实现

    1.饿汉式

    饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变

     1 package com.bingoogol.designpattern.singleton;
     2 
     3 /**
     4  * 饿汉式
     5  * 
     6  * @author bingoogol@sina.com
     7  */
     8 public class SingletonA {
     9     
    10     private static SingletonA instance = new SingletonA();
    11 
    12     /**
    13      * 构造方法必须是私有的
    14      */
    15     private SingletonA() {
    16     }
    17     
    18     /**
    19      * 提供能够对该实例加以访问的全局访问方法
    20      * @return
    21      */
    22     public static SingletonA getInstance() {
    23         return instance;
    24     }
    25 }
    查看代码

    2.懒汉式

     1 package com.bingoogol.designpattern.singleton;
     2 
     3 /**
     4  * 懒汉式
     5  * 
     6  * @author bingoogol@sina.com
     7  */
     8 public class SingletonB {
     9     private static SingletonB instance = null;
    10 
    11     private SingletonB() {
    12     }
    13     
    14     //这种方式的坏处是,当有线程在占有该资源时,其他线程都必须在该方法外部等待
    15     public static synchronized SingletonB getInstance() {
    16         if (instance == null) {
    17             instance = new SingletonB();
    18         }
    19         return instance;
    20     }
    21 }
    查看代码

    3.双重检查

     1 package com.bingoogol.designpattern.singleton;
     2 
     3 /**
     4  * 双重检测
     5  * 
     6  * @author bingoogol@sina.com
     7  */
     8 public class SingletonC {
     9     private static SingletonC instance = null;
    10 
    11     private SingletonC() {
    12     }
    13 
    14     public static SingletonC getInstance() {
    15         if (instance == null) {
    16             // [1]
    17             synchronized (SingletonC.class) {
    18                 if (instance == null) {
    19                     //线程一在此之前线程二到达了位置[1],如果此处不二次判断,那么线程二执行到这里的时候还会重新new
    20                     instance = new SingletonC();
    21                 }
    22             }
    23         }
    24         return instance;
    25     }
    26 }
    查看代码
  • 相关阅读:
    C# 开发规范
    C# 调用webserver 出现:未能从程序集“jgd3jufm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型
    C# 组装XML传给webserver+XML 返回获取多个xml,根据多个XML 返回dataset类型
    linux下搭建git服务器
    Linux整合Apache和SVN
    JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)
    比尔盖茨的十句忠告
    Spring核心接口之InitializingBean
    mongodb安装和配置
    redis主从配置
  • 原文地址:https://www.cnblogs.com/bingoogol/p/DesignPattern-singleton.html
Copyright © 2011-2022 走看看