首页 文章 精选 留言 我的

精选列表

搜索[架构设计],共10010篇文章
优秀的个人博客,低调大师

我是架构师--设计模式-单例模式

来次面试吧?准备好没,GO! 问:自我介绍下吧。(开个玩笑。。。往下)请问你用过单例模式吗?什么是单例? 答:用过啊,单例模式就是只创建一个实例。 问:噢?那是单线程,还是多线程下都是呢? 答:这个类在JVM里就一个实例(这样回答也许会更好) (注:通常面试官,到这里,就会让你写一个单例,当然我们不,你看这篇文章,就是不让你再网上找其他重复的资料了。) 问:说说你用的场景吧 答:........ 问:说说单例的几种类型?或者说何时对实例的初始化? 答:........ 问:画过单例的类图吗?会画吗? 答:(需要吗?) 问:写个单例的实现吧? 类名:SingleTon 实例:uniqueInstance 简称ust吧。(这里我插入一句编程规范:起名不要吝惜把实例代表的意思表达清楚,名字可稍微长点,这里就是想偷懒) 实现1: publicclassSingleton{ privatefinalstaticSingletonust=newSingleton(); privateSingleton(){} publicstaticSingletongetInstance(){ returnust; } } 注:这里顺便说明一下语法。通常final与static同时出现,习惯让final在前 分析: 1. 这里需要加final吗? 是的,因为java反射,可以改变private描述的变量 2. 有书里把这种方式称为饿汉单例模式(另一个种叫懒汉单例),并且已经为人所接受 3. 在多线程方面表现出了他优势,不需要担心方法重复里延时创建带来的原子性(这样说难理解,其实就是出现两个或多个实例) 4. 这个,不符合我们习惯的 用到时再实例化的原则(不过这没关系。。。) 看,其实你发现这还是个不错的单例,那么其实有个最好的实现,最好的实现: 单元素的枚举类型已经成为Singleton的最佳实践 即使面对复杂的序列化或者反射攻击,绝对防止多次实例化,还有他的简洁和优雅。 ----好吧,面试结束了。 其实你对单例的理解还是不错的,而且你已经得到了最好的答案,有兴趣彻底玩转单例吗,继续听我唠叨。 我们看看懒汉单例模式: 实现2: publicclassSingleton{ //privatefinalstaticSingletonust=null; // 不该加final,这里明显有偷懒嫌疑,复制上面的例子,又测试不够,以后尽量避免类似问题。 // 8月15日修正 private static Singleton ust = null; privateSingleton(){} publicstaicSingletongetInstance(){ //建议null==ust的方式,能帮助更快的发现错误。 //部分老程序员的习惯,其实许多IDE会发现些低级错误。 if(ust==null){//A ust=newSingleton();//B } returnust; } } 分析: 1. 懒汉模式,做到了需要时创建实例 2. 他遇到了尴尬的问题,因为当两个线程分开运行到A,然后进入了if块,可能就创建了2个实例,草稿的是,你已经初始了一些数据。 改进一下: 实现3: publicclassSingleton{ privatevolatilestaticSingletonust; privateSingleton(){} publicstaicSingletongetInstance(){ synchronized(Singleton.class){ if(ust==null){ ust=newSingleton(); } } returnust; } } 分析: 1. 如果你不理解synchronized 的位置,就不用单例模式这么多写法,不如学习基础 2. volatile 确保ust被实例化后,多个线程正确处理。他失去了JVM必要的代码优化,如果不是多线程,就不要用 3. 这个叫做 “双检查加锁”,单例最后一种方式 综合讨论会: 小明: 单例目前一共谈到懒汉和饿汉两种,还有双检查加锁,最好的应该是单元素的枚举类型 小刚: 是的,回答了开头说的几种单例,那么哪些场景应该用单例呢? 小明: 我知道,有线程池,缓存,处理偏好设置,注册表,日志对象等等 小刚: 对,我对java比较了解,我知道Runtime.getRuntime()。 C(为吗我叫C):我知道有java.lang.reflect.Proxy类 小明:有什么共同点呢,为什么用?是遵循对象尽量少创建原则? C:这是什么意思? 小刚:这很简单,不过这说法有点问题。因为对象占内存,有要造成垃圾回收,GC的时候JVM可是只干这个麻烦事 小明:是啊! 小刚:我想我知道,某些对象最好只有一个实例,多了会有问题产生。 C:什么问题? 小刚:比如缓存,你从哪个实例里拿缓存呢? 小明:是的啊。。。 结束讨论会,总结一下吧。不,等等,还要补充两句: 1. 单例模式定义:确保一个只有一个实例,并提供一个全局访问点 2. 如果getInstance()方法对应用程序不会额外负担,或者说影响不大,那写成怎样,其实没太大所谓。但是如果频繁运行,就要仔细考虑,因为一个同步,可能使得执行效率下降100倍 继续总结,还差个UML图呢,不妨在上个枚举的例子吧,枚举构造器默认私有吗? 枚举就算了,是不是默认构造器,自己研究下吧。。。呵呵 这回真总结了: 1. 单例,有懒汉,饿汉,双检查加锁3种常见用法 2. 单例模式,是因为如果多了,会造成数据遗漏等麻烦 3. 最好的单例,单元素的枚举类型 呵呵,其实,就这些,本来想先写工厂的,因为去面试,遇到某些对单例了解比较浅,解释起来费劲,于是先以单例开篇,请关注下篇工厂模式。 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/yjplxq/931861,如需转载请自行联系原作者

优秀的个人博客,低调大师

学生机房虚拟架构设计初步实现

一、安装系统 1、硬盘安装 第一步,使用U盘引导进入PE,对目标磁盘进行格式化操作,并分33G为NTFS格式,位于磁盘的最后部分。[此部分涉及用它盘来处理母盘] 第二步,用另一个U盘拷贝硬盘安装系统所必须的文件:mini-10.10.iso以及从/casper/中提取的文件initrd.lz、linux。 第三步,利用U盘中的Grub来引导iso镜像进行硬盘安装。menu.lst的 find /linux root (hdx,y) 注:(hdx,y) 是在find /linux命令后得出的结果。 kernel /linux iso-scan/filename=mini-10.10.iso ro quiet initrd /initrd.gz boot 在安装过程中会问地区,然后会友好的提供对应地区的网络镜像网站,然后从网络上下载软件包的信息,这段时间会因网络的好坏而有所不同。 第四步,分区设置/boot—150M,swap—3G,/--51.6G,/vmos--160G。 2.安装chkconfig 可以方便的实现服务在不同的开启与关闭 sudo apt-get install chkconfig 3.开启SSH 最大的目的是为了在远程调试方便、传输文件方便、使用Clonezilla方便。 sudo apt-get install ssh 4.安装vmaker GUI环境 sudo apt-get install wmaker 5.启动GUI会出现'startx' is currently not installed. shenzhi@sz08254:/$ startx The program 'startx' is currently not installed. You can install it by typing: sudo apt-get install xinit 6.安装xinit sudo apt-get install xinit 7.压缩与解压支持 增加 rar 软件压缩和解压缩支持 sudo apt-get install rar unrar 增加 zip 格式压缩和解压缩支持[此项不用做,安装完file-roller后就有了] sudo apt-get install zip unzip 二、安装VM 2.1上传准备 在ubuntu中安装sshfs sudo apt-get install sshfs 挂载当前linux系统的文件夹到ubuntu[在ubuntu中执行命令] shenzhi@sz08254:~$ sshfs shenzhi@192.168.0.107:/home/shenzhi/vmbak /home/shenzhi/soft 我是通过ssh工具远程登录到ubuntu主机 sz08254上,然后 sshfs shenzhi@192.168.0.107:/home/shenzhi/vmbak 回访当前的Linux系统的目录,将其挂载到ubuntu主机 sz08254的目录/home/shenzhi/soft下。 =============sshfs 网络参考资料============= sshfs name@server:/path/to/folder /path/to/mount/point 这条命令可以让你通过 SSH 加载远程主机上的文件系统为本地磁盘,前提是你需要安装 FUSE 及 sshfs 这两个软件。 卸载的话使用 fusermount 命令: fusermount -u /path/to/mount/point =============sshfs 网络参考资料============= 2.2上传文件-再生龙Clonezilla clonezilla-disk.rar 2.3解压文件 unrar x clonezilla-disk.rar 2.4 ubuntu 10.10显示grub菜单 安装ubuntu10.10后,如果机器上只有一个系统,默认grub菜单是不会显示的,如果想要显示,按如下步骤操作: 1.把/etc/default/grub文件中的GRUB_HIDDEN_TIMEOUT=0的0改为大于0的数字,比如5; 2.把/etc/grub.d/30_os-prober文件中的所有set timeout=0的0改为10,如下: adjust_timeout () { if [ "x${found_other_os}" = "x" ] ; then if [ "x${GRUB_HIDDEN_TIMEOUT}" != "x" ] ; then if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then verbose= else verbose=" --verbose" fi if [ "x${GRUB_HIDDEN_TIMEOUT}" = "x0" ] ; then cat <<EOF if [ /${timeout} != -1 ]; then if keystatus; then if keystatus --shift; then set timeout=-1 else set timeout=10 fi else if sleep$verbose --interruptible 3 ; then set timeout=10 fi fi fi EOF else cat << EOF if [ /${timeout} != -1 ]; then if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then set timeout=10 fi fi EOF fi fi fi } 来自:http://blog.chinaunix.net/u2/61800/showart_2371499.html 使grub的设置生效 sudo update-grub 三、设置自动脚本 [待续中……] 本文转自tiancong 51CTO博客,原文链接:http://blog.51cto.com/tiancong/738314

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册