职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1315|回复: 10

面试官说这个单例模式有问题

[复制链接]
走失的猫咪 发表于 2012-2-16 11:47 | 显示全部楼层 |阅读模式
周三去面试,其中是有个写单例模式的例子,我写了如下,面试官叫我看清楚点有无什么问题。。。
public class A{
  private static A a=new A();
  public static A getInstance(){
         return a;
  }
}


这个单例模式的例子有问题吗???他说要加上synchronized..我晕,不是他回家复习就是我回家复习啦。。。大家指教下

天上智喜 发表于 2012-2-16 11:47 | 显示全部楼层
应该是他有问题。。。

楠楠 发表于 2012-2-16 11:47 | 显示全部楼层
1 可能是你论坛发帖没写全……要private构造器

2 你确定他说的不是Serializable序列化,而是synchronized?单例要考虑序列化之后反序列化的问题。

高端点的做法是使用enum来写单例,这样写出来你可以装一把。
public enum A
{
   INSTANCE;

   public void method(){ ... }
}
自动免疫序列化以及反射的问题。
而且简洁……






只学java 发表于 2012-2-16 11:47 | 显示全部楼层
上面的说的是正确的。

只不过还要添加一个final,表示这个对象的地址不可改变,这个变量a就是固定的了,如果没有final,那该类的另外一个方法可以改变它。顺便付上饿汉和懒汉单例:

饿汉式单例:
public class EagerSingleton
{
  private static final EagerSingleton eagerSingleton = new EagerSingleton();

  private EagerSingleton(){}

  public static EagerSingleton getInstance()
  {
   return eagerSingleton;
  }

}



懒汉室单例:

public class LazeSingleton
{
  private static LazeSingleton lazeSingleton = null;
  
   private LazeSingleton(){}

  public static LazeSingleton getInstance()
  {
   if(lazeSingleton == null){
      lazeSingleton = new LazeSingleton();
   }
      return lazeSingleton;
  }

}

月上萧萧 发表于 2012-2-16 11:47 | 显示全部楼层
懒汉的少了一个synchronized.

更正为:

懒汉室单例:

public class LazeSingleton
{
  private static LazeSingleton lazeSingleton = null;
  
   private LazeSingleton(){}

  synchronized public static LazeSingleton getInstance()
  {
   if(lazeSingleton == null){
      lazeSingleton = new LazeSingleton();
   }
      return lazeSingleton;
  }

}

找不到我 发表于 2012-2-16 11:48 | 显示全部楼层
周三去面试,其中是有个写单例模式的例子,我写了如下,面试官叫我看清楚点有无什么问题。。。
public class A{
  private static A a=new A();
  public static A getInstance(){
         return a;
  }
}


这个单例模式的例子有问题吗???他说要加上synchronized..我晕,不是他回家复习就是我回家复习啦。。。大家指教下

怎么没看到你的构造方法????默认的,默认的可是public的啊
ksdal 发表于 2012-2-16 11:48 | 显示全部楼层
的确,木有私有的构造方法,而且一般单例多用在并发里,最好用synchronized控制。
不过在懒汉式的多线程情况下,可以使用Double-Check Locking:
Java代码  
public class Singleton { // 懒汉式单例   
  
    private static Singleton singleton = null;   
  
    private Singleton() {   
    }   
  
    public static Singleton getInstance() {   
        if (singleton == null) {   
            synchronized (Singleton.class) {   
                            if(singleton == null) {   
                singleton = new Singleton();   
                             }   
            }   
        }   
        return singleton;   
    }   
}  

public class Singleton { // 懒汉式单例

        private static Singleton singleton = null;

        private Singleton() {
        }

        public static Singleton getInstance() {
                if (singleton == null) {
                        synchronized (Singleton.class) {
                            if(singleton == null) {
                                singleton = new Singleton();
                             }
                        }
                }
                return singleton;
        }
}

因此在多线程中,如果每次都要去判断线程中时候时候有实例,很耗性能,这里只要在开始判断即可,如有有了实例就无需进入同步中...

紫衿 发表于 2012-2-16 11:48 | 显示全部楼层
楼上的正解

fossil 发表于 2012-2-16 11:48 | 显示全部楼层
的确,木有私有的构造方法,而且一般单例多用在并发里,最好用synchronized控制。
不过在懒汉式的多线程情况下,可以使用Double-Check Locking:
Java代码  
public class Singleton { // 懒汉式单例   
  
    private static Singleton singleton = null;   
  
    private Singleton() {   
    }   
  
    public static Singleton getInstance() {   
        if (singleton == null) {   
            synchronized (Singleton.class) {   
                            if(singleton == null) {   
                singleton = new Singleton();   
                             }   
            }   
        }   
        return singleton;   
    }   
}  

public class Singleton { // 懒汉式单例

        private static Singleton singleton = null;

        private Singleton() {
        }

        public static Singleton getInstance() {
                if (singleton == null) {
                        synchronized (Singleton.class) {
                            if(singleton == null) {
                                singleton = new Singleton();
                             }
                        }
                }
                return singleton;
        }
}

因此在多线程中,如果每次都要去判断线程中时候时候有实例,很耗性能,这里只要在开始判断即可,如有有了实例就无需进入同步中...


这个是正解。一般单例是用在实例比较耗资源的场景。一般情况下,饿汉模式已经可以了。


能文能武 发表于 2012-2-16 11:48 | 显示全部楼层
没有把构造函数私有化
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-20 21:38 , Processed in 0.136584 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表