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 }
    查看代码
  • 相关阅读:
    IT人士必去的10个网站
    c++怎样让函数返回数组
    vs中“Stack around the variable was corrupted”的解决方案
    c++ eof()函数
    bat开发小工具以及使用
    Python接口自动化(一)---json数据类型取值
    MAVEN编译错误解决:maven only whitespace content allowed before start
    shell常用命令总结总结
    shell打包和解压
    java总结笔记
  • 原文地址:https://www.cnblogs.com/bingoogol/p/DesignPattern-singleton.html
Copyright © 2011-2022 走看看