黑马程序员技术交流社区

标题: 单例设计模式 [打印本页]

作者: 陈春    时间: 2013-7-30 20:36
标题: 单例设计模式


                                               单例设计模式
单例设计模式分为饿汉式和懒汉式。主要用于解决对象的唯一性的问题。
  
饿汉式:
     基本思想:
            ①  私有构造方法
            ②  本类中创建自己的对象
            ③  提供一个静态方法,返回本类对象的引用
     具体代码如下:
     class Single
             {
                      private Single(){}
       
                      private static Single s = new Single();

                      public static Single getInstance()
                  {
                          return s;
                      }
       
             }



相对而言,懒汉式要麻烦许多。要考虑到线程的安全问题。而传说中的面试,貌似偏偏就喜欢复杂的。

懒汉式:
     基本思想:
              ① 私有构造方法
              ② 创建引用型变量,但是,不创建对象
              ③ 提供公共的静态的方法,先要判断对象是否为空。但是,这里就涉及到一个线程安全问题。假如线程A判断完对象为空。它本应该创建对象,然而就在此时,CPU去执行其他的任务。线程A就停在这里。当线程B来执行这里的时候,它也要判断一下,假如同样的事情又发生了。就会有两个线程卡在哪里。当CPU再一次回来执行线程A的时候,它已经判断完了,程序往下执行,创建对象。然后,线程B回来继续执行的时候,因为它也已经判断过了。那么它也创建一个对象。于是,问题也就出现了,这样便不能保证对象的唯一性。那么,我们就必须在判断完后再加上一把锁。每一次程序进去的时候先判断,再进去拿到对象锁,再创建。哪没有拿到锁的线程,它就不能进去执行。更不能创建对象。

具体代码如下:


class Single
{
        private static Single s = null;
        private Single(){}
         
        public static Single getInstance()
        {
                if(s==null)
                {
                        synchronized(Single.class)
                        {
                                if(s==null)
                                {
                                        s = new Single();
                                }
                        }
                }
        return s;       
        }
}

相对而言,饿汉式的安全性和运行效率较高,而懒汉式的相对较低。
以上就是我理解的单例模式了。看见他们应用的比较多,所以分享一下。


作者: 黑马李昂    时间: 2013-7-30 23:25
恩 我也看到这里了
   共同学习!{:soso_e100:}
作者: HMHM汪磊    时间: 2013-7-31 07:53
单例模式的构造方法也可以是protected的,。。。。这样程序扩展性好。。。自己查资料学吧!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2