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

    public Singleton

    {

      public static Singleton singleton;

      

      public static Singleton GetInstance()

      {

        if(singleton == null)

        {

          singleton = new Singleton();  

          return singleton;

        }

          return singleton;

      }

    }

    1、多线程下 使用单例模式时可能会创建多个实例这一现象的解决方案。

    可以先将一个线程锁定。

    多线程访问GetInstance()中的if语句,比如,有两个线程同时到达

    如果Singleton !=null 的话,那么上面的问题是不会存在的,因为已经存在这个实例了,这样的话,所有的线程都无法进入if语句。

    也就是所有的线程都无法调用new Singleton()了。

    这样还可以保证应用程序生命周期中的实例只有一个。

    如果此时singleton == null 的话,那么意味着都是可以进入if语句的。

    那么就有可能出现的到哪里中有多个实例的问题。

    此时,我可以让一个线程先进入if语句块,然后我在外面对这个if语句块加锁,

    对第二个线程呢,由于if语句进行了加锁处理,所以这个进程就无法进入if语句块而处于阻塞状态。

    当进入了if语句块的线程完成new Singleton()后,这个线程便会退出if语句块。

    此时第二个线程就从

    public Singleton

    {

      public static Singleton singleton;

      public Object object;

      public static Singleton GetInstance()

      {

        if(singleton == null)//这个是很有必要的,防止每次进入的是都有去锁定程序块,这样如果singleton!=null的时候就不用过去锁定程序快乐

        {

         synchronized(object)

         {

            if(singleton==null)

            {

              

              singleton = new Singleton();  

              return singleton;

            }

         }

          

        }

        return singleton; 

      }

    }

  • 相关阅读:
    技术普及帖:你刚才在淘宝上买了一件东西
    centos 安装yum
    eclipse 中java 项目红色感叹号终极解决方案
    centos x8664位版本 想安装qq for linux
    甲骨文放弃对RHEL的ASMLib支持
    amoeba连接mysqlERROR 2006 (HY000): MySQL server has gone away
    让Fedora 15/CentOS 6显示详细启动信息,不显示进度条
    Oracle10g RAC安装手册
    如何控制oracle RAC 进行并行运算
    利用mysql的inet_aton()和inet_ntoa()函数存储IP地址
  • 原文地址:https://www.cnblogs.com/lobsterIT/p/4884560.html
Copyright © 2011-2022 走看看