问题描述
今天有人面试我单例:我写如下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、禁止外部调用构造函数 设置 private2、禁止反射设置构造函数创建accessable,调用构造函数,可以再构造函数内判断是否已经创建过对象3、禁止反序列化创建对象,需要重写readResolve方法4、禁止clone,其实也不算禁止吧,重新clone,返回你的引用就OK你看看你的单例 有没有处理这几种情况,关于synchronized,个人还是觉得需要使用,考虑到线程安全问题代码就不贴了 楼下都有
解决方案二:
你的对。但经理想考你的应该是看你能不能注意到线程同步问题。你写的这种方式没有问题。不过要是换到懒加载写法,同时又有线程同步问题时,必须加上synchronized
解决方案三:
你这种是对的,他的这种也是对的,而且他的这种更好,
解决方案四:
面试经理就是个傻X 啥也不会还总JB装 这样公司趁早别去 去了也是耽误自己最怕的就是领导啥也不会 还瞎JB指挥的 遇到了真无语
解决方案五:
看看这个帖子:http://www.iteye.com/topic/652440关于双重锁定和单例模式Double-checked locking and the Singleton patternhttp://www.ibm.com/developerworks/java/library/j-dcl/index.html
解决方案六:
确实,这个主要是考虑多线程情况下可能破坏单例! 经理考虑的全面啊
解决方案七:
你是对的,因为实例一开始就初始化出来了,这种非lazy-load的模式不需要加synchronized。当然,及时是lazy-load方式,,我也不乐意在getInstance上加synchronized,为了防止个别极端情况下new 出多个实例,而加个sb synchronized来影响性能,太二了。
解决方案八:
可以参考http://raychase.iteye.com/blog/1471015其实单例有多种写法,以前还看到一篇iteye的文章是层层递进从最简单的实现到懒加载到静态化到线程。
解决方案九:
public class Test(){ private static Test test=new Test(); privateTest(){}}
解决方案十:
你的答案完全可以保证整个应用下只有一个实例,static修饰的,jvm内存中只有一份。详细的单例说明可以参考何海涛的《剑指offer》第二道面试题,http://ishare.iask.sina.com.cn/f/33644458.html
解决方案十一:
没有同步,哪来的单例啊?
解决方案十二:
加上同步是对的 请看我的博客 http://ddlgyq.iteye.com/blog/1899647
解决方案十三:
你对!