当前位置: 代码迷 >> J2EE >> 有道面试题,大伙儿看看
  详细解决方案

有道面试题,大伙儿看看

热度:68   发布时间:2016-04-17 23:16:29.0
有道面试题,大家看看
public class Class1
      {
            private static Class1 oInstance = null;

            private Class1()
            {

            } 

            public static Class1 GetInstance()
            {
                  if(oInstance == null)
                  {
                       oInstance = new Class1();
                  }
                  return oInstance;
            }
      }


问这段程序有什么问题,我答的是GetInstance被声明成static了,其他类都可以调用它而且不用实例化Class1。

但是oInstance和Class1()都是private的,那其他类调用GetInstance时就不能使用或访问oInstance和Class1()。造成运行时错误。

这样答对吗?
------解决思路----------------------
Singleton……
你去查下设计模式中的单例模式,要的就是这效果
而且这个缺少了lock二次检查
外部是通过GetInstance()方法来获取Class1的实例,在程序中,Class1只会被实例化一次
------解决思路----------------------
少了同步

最好用赖汉机制 写单例

------解决思路----------------------
貌似你答的不对
单例模式。
虽然一般我写单例都这样写,
但是知道规范的是方法中应该添加synchronized锁,另外方法首字母规范是小写。
------解决思路----------------------
做两点改变:
1.使用volatile声明oInstance ,保障数据是最新的。
2.使用double check 保障线程安全。
3.GetInstance这个方法命名不规范,严格说Class1命名也不规范。
------解决思路----------------------
if(oInstance == null){
synchronized(class1.Class){
if(oInstance== null)
oInstance = new Class1();
}
}
return oInstance;

------解决思路----------------------
引用:
Quote: 引用:

Singleton……
你去查下设计模式中的单例模式,要的就是这效果
而且这个缺少了lock二次检查
外部是通过GetInstance()方法来获取Class1的实例,在程序中,Class1只会被实例化一次


返回的是oInstance,它已经被声明为statics了,所以只被实例化一次。他让找这段程序的问题。

设计模式的书去哪找呢?他还问这是gang of four设计模型中的哪种,这名字都没听过,现在大学里讲这个吗?

这个代码的确是有问题啊,我不是说了吗,少了锁的检查,在并发的情况下可能会导致new多次,违背了只能实例化一次的需求,是GOF23种模式中的Singleton(单例),大学不讲这些东西的,应该,至少我学过的计算机科学与技术不讲这些(他妈的连C#,java都没教过,只教过C)
  相关解决方案