黑马程序员技术交流社区

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

作者: 王陶成    时间: 2012-9-20 00:26
标题: 单例模式
本帖最后由 王陶成 于 2012-9-20 08:23 编辑


         懒汉式和饿汉式各有什么优缺点了?



单例模式写成这样可不可以


public class One06_07 {
        public static void main(String[] args) {
                Dd d1 = Dd.getInstence();
                d1.a = 3;
                Dd d2 = Dd.getInstence();
                System.out.println(d2.a);
        }
}

class Dd{
        static int a;
        private Dd() {
               
        }
        public static Dd getInstence() {
                 Dd d = new Dd();
                 return d;
        }
        public static void sy() {
                System.out.println(a);
        }
}


作者: 霍明波    时间: 2012-9-20 07:07
本帖最后由 霍明波 于 2012-9-20 07:23 编辑

class Dd{
        static int a;
        private Dd() {
               
        }
        public static Dd getInstence() {
                 Dd d = new Dd();
                 return d;
        }
        public static void sy() {
                System.out.println(a);
        }
}
你这个显然不可以,在多个线程执行的时候,如果执行到
  Dd d = new Dd();的时候切换到另一个线程进入的话,调用这个方法就会又
执行Dd d = new Dd();,这样就会创建多个对象了。
一般的要在外面声明出对象,在获得对象的方法中直接返回,也就是说在返回的方法中有一句代码(饿汉式);
class Dd{
        static int a;
        private Dd() {
               
        }
        private static final Dd  d = new Dd();
        public static Dd getInstence() {
              //   Dd d = new Dd();
                 return d;
        }
        public static void sy() {
                System.out.println(a);
        }
}
懒汉式在你的代码public static Dd getInstence() 中加同步修饰:
饿汗式:在外部静态的创建出对象,而懒汉式实在获得对象方法中创建对象 ,想你写了两块代码。
一般的用饿汉式,比较快,省资源。
                 
作者: 彭润生    时间: 2012-9-20 07:13
楼上说的很对,你这样就不是单例模式了,单例必须在getInstance里获取对象,而你的这个构造了对象,所以,每一次getInstance就会产生一个对象,所以就不是单例了。如果要单例那么就改为 在类里面定义这样的一个成员private static Dd d = new Dd();
然后public static Dd getInstance(){return d;}




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