zoukankan      html  css  js  c++  java
  • 设计模式(二):单例模式

    单例模式:用来创建只能有一个实例的对象。确保一个类只有一个实例,并提供一个全局访问点。

    有的时候我们不希望一个类被创建出多个对象,因为多个实例会带来许多不好的影响。

    经典单例模式:

    public class SingleInstance {
               private static SingleInstance instance;
               private SingleInstance(){}
               public static SingleInstance getInstance(){
                   if(instance == null){
                       instance = new SingleInstance();
               }
                   return instance;
        }
        ...........
    }

    在类中定义静态变量记录类的唯一实例,然后定义一个私有的构造器,这样外部便无法实例化,再声明一个getInstance()方法实例化对象,并返回实例。

    这样,当外部想实例化时,只需要调用SingleInstance.getInstance()方法便可获得唯一的实例。

    但是上述经单例模式在处理多线程时还是会遇到错误,经常会被多个线程同时调用。

    通过增加synchronized关键字到getInstnce()方法中,变成同步方法,就可以解决多线程问题。

    但是同步方法会引发性能问题,每次都要同步这个方法,但事实上只要第一次同步即可。

    所以最完善的办法便是采用 ”双重检查加锁“,在getInstance()方法中减少使用同步。

    public class SingleInstance {
          private volatile static SingleInstance instance;
          private SingleInstance(){}
          public static SingleInstance getInstance(){
                   if(instance == null){
                       synchronized (SingleInstance.class) {
                           if(instance == null){
                               instance = new SingleInstance();
                       }
                    }
                  }
                   return instance;
              }
    }

    private volatile static SingleInstance instance;

    volatile关键词确保当instance变量被初始化成实例时,多个线程正确处理instance变量。

    getInstance()方法只在第一次彻底执行全部代码。

  • 相关阅读:
    数据库 'tempdb' 的日志已满的解决方法
    SQL Server2005|身份验证模式修改转载
    GRUB讲解转载
    远程连接sql server 2000服务器的方法,及配置sql数据库服务器转载
    SQL 删除一列的语句
    陶哲轩实分析 命题 8.2.6 证明
    陶哲轩实分析 引理 8.2.3 证明
    陶哲轩实分析 习题 7.5.3
    陶哲轩实分析 习题 7.5.3
    陶哲轩实分析 引理8.2.7 注
  • 原文地址:https://www.cnblogs.com/kinsomy/p/5151474.html
Copyright © 2011-2022 走看看