无语,单例模式,我错了?还是他?

今天有人面试我单例:
我写如下
Public. Class. Single{
Private. Static. Single=new. Single();
Private. Single(){}
Public. Static. Single. Getintance(){
Return. Single;
}
}

面试经理说我的错了,ok,错了我就改

Private. Final. Static. Single=new. Single();

改为这样,人家还是认为我的有问题,非得还加上
Public. synchronized. Static. Single. Getintance(){
Return. Single;
}

真是无语了

楼主,写一个单例应该需要考虑一个重要问题,对象是怎么创建的:
1、通过构造函数创建
2、通过反射创建
3、通过反序列化创建
4、通过clone创建

提供的解决方案如下:

1、禁止外部调用构造函数 设置 private

2、禁止反射设置构造函数创建accessable,调用构造函数,可以再构造函数内判断是否已经创建过对象

3、禁止反序列化创建对象,需要重写readResolve方法

4、禁止clone,其实也不算禁止吧,重新clone,返回你的引用就OK

你看看你的单例 有没有处理这几种情况,关于synchronized,个人还是觉得需要使用,考虑到线程安全问题

代码就不贴了 楼下都有

你对! :P

加上同步是对的 请看我的博客 http://ddlgyq.iteye.com/blog/1899647

没有同步,哪来的单例啊?

你的答案完全可以保证整个应用下只有一个实例,static修饰的,jvm内存中只有一份。详细的单例说明可以参考何海涛的《剑指offer》第二道面试题,[url]http://ishare.iask.sina.com.cn/f/33644458.html[/url]

[code="java"]
public class Test(){
private static Test test=new Test();
privateTest(){}
}
[/code]

可以参考http://raychase.iteye.com/blog/1471015
其实单例有多种写法,以前还看到一篇iteye的文章是层层递进从最简单的实现到懒加载到静态化到线程。

你是对的,因为实例一开始就初始化出来了,这种非lazy-load的模式不需要加synchronized。
当然,及时是lazy-load方式,,我也不乐意在getInstance上加synchronized,为了防止个别极端情况下new 出多个实例,而加个sb synchronized来影响性能,太二了。

确实,这个主要是考虑多线程情况下可能破坏单例! 经理考虑的全面啊

看看这个帖子:
[url]http://www.iteye.com/topic/652440[/url]

关于双重锁定和单例模式
Double-checked locking and the Singleton pattern
[url]http://www.ibm.com/developerworks/java/library/j-dcl/index.html[/url]

面试经理就是个傻X 啥也不会还总JB装 这样公司趁早别去 去了也是耽误自己
最怕的就是领导啥也不会 还瞎JB指挥的 遇到了真无语

你这种是对的,他的这种也是对的,而且他的这种更好,

你的对。
但经理想考你的应该是看你能不能注意到线程同步问题。
你写的这种方式没有问题。
不过要是换到懒加载写法,同时又有线程同步问题时,必须加上synchronized

推荐你看下这篇文章![url]http://jsonliangyoujun.iteye.com/blog/2355384[/url]