锁定老帖子 主题:本人java笔试常见题目小结
精华帖 (0) :: 良好帖 (3) :: 新手帖 (1) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-26
貌似我收藏了一个更全的...呵呵!
|
|
返回顶楼 | |
发表时间:2010-03-26
都2年了,这些面试题怎么好像都一样
|
|
返回顶楼 | |
发表时间: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代码。应该是为了保持至始至终产生一个单例。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 翻译下 哈哈~ |
|
返回顶楼 | |
发表时间: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 翻译下 哈哈~ 。。。不用吧 |
|
返回顶楼 | |
发表时间: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的信仰里 良好的结构美感永远高于对于性能的追求 |
|
返回顶楼 | |
发表时间:2010-03-26
jmu 写道 双重检查成例---在阎宏的书中看到, 提到在c/c++下成立的 在java中可能出问题 中文的讨论在这里 http://www.jdon.com/jivejdon/thread/23890 我认为无论这个成不成立,都最好不要用吧,, 单例本身就是个低性能的做法,只有在最适合单例的地方才会用到,除了理论学术的考量,没必要非要死扣怎么写性能怎么好。 在java的信仰里 良好的结构美感永远高于对于性能的追求 singleton和低性能有必然的联系吗?如果用singleton对象对内存不敏感,用eager initialization策略对性能有什么损耗? 引用 懒汉和饿汉的使用按需求而定 而不是那点可怜的性能
引用 在java的信仰里 良好的结构美感永远高于对于性能的追求
你这话不是很矛盾吗?既然认同lazy initialization策略有其适合的场合。为什么又在后面下绝对的结论,发贴本来就是大家讨论各种全面情况,对各种情况下有清楚的认识才能正确的选择。 |
|
返回顶楼 | |
发表时间:2010-03-26
楼主的subString(String str, int len)方法小弟没看懂,如果我想要得到subString(“我ABC汉DEF”, 7)
不知可否得到"我ABC汉" |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |