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

问题描述

今天有人面试我单例:我写如下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
解决方案十三:
你对!

时间: 2024-07-28 19:24:58

无语,单例模式,我错了?还是他?的相关文章

秒换算成(时:分:秒)的算法,网上搜到的居然都算错了,无语中.....

#include  < iostream >  using   namespace  std; int  main () {     int  nHour;     int  nMin;     int  nSec;     int  nTotalSec  =   600 ;    nHour  =  nTotalSec  /   3600 ;    nTotalSec  -=  nHour  *   3600 ;    nMin  =  nTotalSec  /   60 ;    nSec

深入理解JavaScript系列(25):设计模式之单例模式详解

 这篇文章主要介绍了深入理解JavaScript系列(25):设计模式之单例模式详解,本文给出了多种单例模式的实现方式,需要的朋友可以参考下     介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例

可能是最全的Java单例模式讨论

单例模式 最简单但是也挺困难的. 要保证在一个JVM中只能存在一个实例,要考虑到如下的情况: Java能够使用那些方式构建对象 Java在创建对象时多线程并发情况下是否仍然只能创建一个实例 Java创建对象的方法: new 最常用的,直接使用构造器创建. 每new一次都会产生新的实例.所以单例中应该只new一次,当再想用对象时都返回该对象的值 Class.newInstance() 该方法会调用public 的无参构造器. 为了防止这个方式创建,只要把构造器设置为private的就可以了.这是如

代码-(C#)我实在无语了,Directory.GetFiles错哪里了啊?

问题描述 (C#)我实在无语了,Directory.GetFiles错哪里了啊? 下午写的第一行代码就出错,呜.............. 刚初学C#没多久.今天下午打开电脑,开始学listBox.先不管我想干啥,用途是什么,我就想问问,我的Directory.GetFiles代码语法错误在哪啊?那个地址我都是直接从文件夹属性里复制过来了,为啥就不支持啊?我还重看了好几遍视频教程里老师讲解Directory,对着视频教程挨个字母检查了,视频里老师咋不出错啊,我的就错了? 我..........!

有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!!

问题描述 有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!! 解决方案 解决方案二:引用楼主duobiao的回复: 有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!! ......怎么会出错呢难道你做什么都不判断么?解决方案三:报啥错?解决方案四:一句话问题!不知道你是用什么做的,操作数据库用的是什么,数据库用的是什么,反正要有的什么都没有!解决方案五:引用2楼swan

设计模式详解之单例模式

单例模式(Singleton): 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销. 2.省去了new操作符,降低了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了.(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心

又一次选错了IDC

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 可恶,买后才知道又买错了,能怪谁. 自己找个大树撞头吧.我一共买过2个IDC的空间.都是便宜的,第一个是火山互联,我已经不用了.我说说我现在用的空间,真的是很气愤. 准备买空间的时候我是在一个"主机评测类网站"查询到现在用的这个空间的IDC, 对该IDC的好评率差不多70%.现在想想那些好评,可能大部分都是托,郁闷

scala实现单例模式

单例模式介绍 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器.如在Windows中就只能打开一个任务管理器.如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源:

io-dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null

问题描述 dom4j中因为输出流未正确关闭,导致再次获取单例模式的document时,对象为null 一:如下是获取单例模式的document对象. private static Document returndoc(Document docuname, String xmlname) { if (docuname != null) { return docuname; } SAXReader reader = new SAXReader(); // 如果不存在就创建对象. try { docu