论坛首页 Java企业应用论坛

本人java笔试常见题目小结

浏览 16215 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (1) :: 隐藏帖 (12)
作者 正文
   发表时间:2010-03-26  
貌似我收藏了一个更全的...呵呵!
0 请登录后投票
   发表时间:2010-03-26  
都2年了,这些面试题怎么好像都一样
0 请登录后投票
   发表时间:2010-03-26   最后修改:2010-03-26
seraphim871211 写道
J-catTeam 写道
crabboy 写道
diaodou 写道
Singleton必须添加private构造函数,不然就失去singleton的意义了。而且,性能太差了,会继续追问有很有更好的方式?


对这个话题请继续谈谈。。。。

我也觉得奇怪:性能差在哪里


Singleton类肯定要提供默认的private构造函数,要不然就不叫Singleton了。
另外,楼主的第一种方式是空间换时间。第二种方式:
引用

第二种形式:
public class Singleton {
  private static Singleton instance = null;
   public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   }
}


在每次调用Singleton.getInstance()方法的时候都用synchronized同步确实会影响性能,实际上除了第一次instance==null时需要同步,初始化之后同步是没有必要的。通常会这样写:
public class Singleton{
    private volatile static Singleton instance = null;

    private Singleton(){}

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

上述代码保证了只在第一次初始化时同步多线程的安全,性能也不错。唯一的缺点是可能在某些老式的JVM上还是会出现多线程不安全的问题。


多线程不安全又体现在哪里了? 我承认 synchronized(Singleton.class){
        if(instance == null){
        instance = new Singleton();
        }
        }这种写法较之在方法前同步性能在理论上确实是好,但是他的目的不是为了性能吧,因为仅仅是多了一句if代码。应该是为了保持至始至终产生一个单例。
0 请登录后投票
   发表时间:2010-03-26   最后修改:2010-03-26
J-catTeam 写道

多线程不安全又体现在哪里了? 我承认 synchronized(Singleton.class){
        if(instance == null){
        instance = new Singleton();
        }
        }这种写法较之在方法前同步性能在理论上确实是好,但是他的目的不是为了性能吧,因为仅仅是多了一句if代码

。。。。。。理论和实际上那种方式都要比在方法前加synchronized要好,影响性能的不是if语句,是每次调用getInstance方法都必须要同步。

引用
应该是为了保持至始至终产生一个单例。

用Singleton pattern不就是为了保证只有一个实例吗?加同步不就是为了在多线程的情况下保证只产生一个实例?

引用
多线程不安全又体现在哪里了?

传送门:http://www.ibm.com/developerworks/java/library/j-dcl.html


0 请登录后投票
   发表时间:2010-03-26  
seraphim871211 写道
J-catTeam 写道

多线程不安全又体现在哪里了? 我承认 synchronized(Singleton.class){
        if(instance == null){
        instance = new Singleton();
        }
        }这种写法较之在方法前同步性能在理论上确实是好,但是他的目的不是为了性能吧,因为仅仅是多了一句if代码

。。。。。。理论和实际上那种方式都要比在方法前加synchronized要好,影响性能的不是if语句,是每次调用getInstance方法都必须要同步。

引用
应该是为了保持至始至终产生一个单例。

用Singleton pattern不就是为了保证只有一个实例吗?加同步不就是为了在多线程的情况下保证只产生一个实例?

引用
多线程不安全又体现在哪里了?

传送门:http://www.ibm.com/developerworks/java/library/j-dcl.html



翻译下 哈哈~
0 请登录后投票
   发表时间:2010-03-26  
J-catTeam 写道
seraphim871211 写道
J-catTeam 写道

多线程不安全又体现在哪里了? 我承认 synchronized(Singleton.class){
        if(instance == null){
        instance = new Singleton();
        }
        }这种写法较之在方法前同步性能在理论上确实是好,但是他的目的不是为了性能吧,因为仅仅是多了一句if代码

。。。。。。理论和实际上那种方式都要比在方法前加synchronized要好,影响性能的不是if语句,是每次调用getInstance方法都必须要同步。

引用
应该是为了保持至始至终产生一个单例。

用Singleton pattern不就是为了保证只有一个实例吗?加同步不就是为了在多线程的情况下保证只产生一个实例?

引用
多线程不安全又体现在哪里了?

传送门:http://www.ibm.com/developerworks/java/library/j-dcl.html



翻译下 哈哈~


。。。不用吧
0 请登录后投票
   发表时间:2010-03-26  
seraphim871211 写道
J-catTeam 写道
crabboy 写道
diaodou 写道
Singleton必须添加private构造函数,不然就失去singleton的意义了。而且,性能太差了,会继续追问有很有更好的方式?


对这个话题请继续谈谈。。。。

我也觉得奇怪:性能差在哪里


Singleton类肯定要提供默认的private构造函数,要不然就不叫Singleton了。
另外,楼主的第一种方式是空间换时间。第二种方式:
引用

第二种形式:
public class Singleton {
  private static Singleton instance = null;
   public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
  //使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   }
}


在每次调用Singleton.getInstance()方法的时候都用synchronized同步确实会影响性能,实际上除了第一次instance==null时需要同步,初始化之后同步是没有必要的。通常会这样写:
public class Singleton{
    private volatile static Singleton instance = null;

    private Singleton(){}

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

上述代码保证了只在第一次初始化时同步多线程的安全,性能也不错。唯一的缺点是可能在某些老式的JVM上还是会出现多线程不安全的问题。



双重检查成例---在阎宏的书中看到, 提到在c/c++下成立的   在java中可能出问题
中文的讨论在这里
http://www.jdon.com/jivejdon/thread/23890

我认为无论这个成不成立,都最好不要用吧,懒汉和饿汉的使用按需求而定 而不是那点可怜的性能, 单例本身就是个低性能的做法,只有在最适合单例的地方才会用到,除了理论学术的考量,没必要非要死扣怎么写性能怎么好。
在java的信仰里 良好的结构美感永远高于对于性能的追求 





0 请登录后投票
   发表时间:2010-03-26  
jmu 写道

双重检查成例---在阎宏的书中看到, 提到在c/c++下成立的   在java中可能出问题
中文的讨论在这里
http://www.jdon.com/jivejdon/thread/23890

我认为无论这个成不成立,都最好不要用吧,, 单例本身就是个低性能的做法,只有在最适合单例的地方才会用到,除了理论学术的考量,没必要非要死扣怎么写性能怎么好。
在java的信仰里 良好的结构美感永远高于对于性能的追求 

singleton和低性能有必然的联系吗?如果用singleton对象对内存不敏感,用eager initialization策略对性能有什么损耗?


引用
懒汉和饿汉的使用按需求而定 而不是那点可怜的性能

引用
在java的信仰里 良好的结构美感永远高于对于性能的追求

你这话不是很矛盾吗?既然认同lazy initialization策略有其适合的场合。为什么又在后面下绝对的结论,发贴本来就是大家讨论各种全面情况,对各种情况下有清楚的认识才能正确的选择。
0 请登录后投票
   发表时间:2010-03-26  
楼主的subString(String str, int len)方法小弟没看懂,如果我想要得到subString(“我ABC汉DEF”,  7)
不知可否得到"我ABC汉"
0 请登录后投票
   发表时间:2010-03-26  
http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh

public class Singleton {
   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   /**
    * SingletonHolder is loaded on the first execution of Singleton.getInstance()
    * or the first access to SingletonHolder.INSTANCE, not before.
    */
   private static class SingletonHolder {
     private static final Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
     return SingletonHolder.INSTANCE;
   }
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics