单例模式是一种对象创建模式,确保系统中一个类只有一个实例。

在java语言中,这样做有两大好处:

1.对于频繁使用的对象,可以省略创建对象所话费的时间;

2.由于new操作的次数减少,对于系统内存的使用频率降低,这样减少GC的压力,缩短GC停顿的时间。

单例模式细分:

1.

 public class Singleton{
private Singleton(){
System.out.println("Singleton.Singleton()");
} private static Singleton singleton = new Singleton(); public static Singleton getInstance(){
return singleton;
}
}

注意:首先单例类必须有一个private访问级别的构造函数,确保单例不会被系统其他代码实例化;其次,singleton成员变量和getInstance()方法必须是static的。

这个单例类创建十分简单,而且非常可靠。唯一的缺点是无法对singleton做延迟加载,例如由于单例创建过程很慢,由于成员变量定义为static,在jvm加载单例类时,单例对象也会被创建,那么在任何用到单例类的地方都会创建单例对象,不管单例对象是否被用到。例如:

public class Singleton{
private Singleton(){
System.out.println("Singleton.Singleton()");
} private static Singleton singleton = new Singleton(); public static Singleton getInstance(){
return singleton;
} public static void createString(){
System.out.println("Singleton.createString()");
}
}

2.为了提高相关函数的调用速度,就需要引入懒加载机制。

 package com.luchao.singtonle;

 public class LazySingleton {
private LazySingleton() {
System.out.println("LazySingleton.LazySingleton()");
}
private static LazySingleton lazyInstance = null; public synchronized static LazySingleton getInstance(){
if(lazyInstance==null)
lazyInstance = new LazySingleton();
return lazyInstance;
}
}

对于静态变量singleton初始化赋值为null,确保系统启动时没有额外的负荷。在getInstance()方法中,判断当前实例十分已经存在,如果存在则返回,如果不存在,再建单例。getInstance()必须为同步方法,因为在多线程环境下,当线程1正在建单例,未完成赋值前,线程2可能判断instance为null,故线程2将启动建立新建单例的程序,导致多个单例被创建。

上面实例单例实现,虽然实现了延迟加载,但是引入了同步方法,在多线程环境下,耗时远大于第一个单例程序。

3.单例模式使用内部类来维护单例的创建

 public class StaticSingleton {
private StaticSingleton() {
System.out.println("StaticSingleton.StaticSingleton()");
} private static class SingletonHolder{
private static StaticSingleton ataticSingleton = new StaticSingleton();
} public static StaticSingleton getInstance(){
return SingletonHolder.ataticSingleton;
} }

StaticSingleton被加载时,内部类不会被实例化,确保StaticSingleton类被载入jvm时,不会被初始化单例类,而当getInstance()方法被调用时,才加载SingletonHolder,从而初始化instance。同时用于实例的建立在类加载时完成,故天生对线程友好。

使用内部类完成单利模式,既可以做到延迟加载,也不用使用同步关键字,是一种比较完善的做法。

java设计优化--单例模式的更多相关文章

  1. java设计优化--代理模式

    代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为 ...

  2. java设计优化--观察者模式

    观察者模式介绍 观察者模式是一种非常有用的设计模式,在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就非常有用.如果不适用观察者模式,而实现类似的功能,可能就需要另外启动一个线程不停 ...

  3. java设计优化--装饰者模式

    装饰者模式拥有一个设计非常巧妙的结构,它可以动态的添加功能.在基本的设计原则中,有一条重要的设计准则就是合成/聚合复用原则.根据该原则的思想,代码复用应该尽可能使用委托,而不是使用继承.因为继承是一种 ...

  4. java设计优化-享元模式

    享元模式是设计模式中少数几个以调高系统性能为目的的设计模式.它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象.在享元模式中,由于需要构建 ...

  5. 《Java程序性能优化》学习笔记 设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  6. 《Java程序性能优化》之设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  7. Java 程序优化 (读书笔记)

    --From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...

  8. 【Java】Java 深入探讨 单例模式的实现

    在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下.   所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在 ...

  9. java中的单例模式与doublecheck

    转自: http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单 ...

随机推荐

  1. actionlib的身世之谜

    不知道为什么会把这么严肃认真的一篇技术整理贴起这么一个故事会风格类似的名字,就这样吧:^)shenmegui 园子里有人整理了actionlib的初学者教程,我来整理下actionlib的细节描述吧. ...

  2. speex进行音频去噪

    应用speex进行音频去噪,speex功能很强大,因为opus的出现,用speex进行编码/解码的人几乎没有了,但是用speex来进行降噪,去除回声,增益还是很多. 这里用speex进行音频去噪,主要 ...

  3. Containers Reserved yarn resourcemanager

    yarn rm的管理页面中显示了集群的概况,其中有一个指标叫Containers Reserved . 预留的容器,为什么会预留,集群的资源使用饱合,新的app请求的资源一般会进入pending状态, ...

  4. C# WebService URL重写

    背景 有时候我们会有这样的需求,将 WebService URL 中的 asmx 后缀去掉:或者我们要模拟普通 Web 的 URL,接口名称直接拼接在 URL 中.这些情况我们都要用到URL重写. 关 ...

  5. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  6. AC日记——过滤多余的空格 1.7 23

    23:过滤多余的空格 总时间限制:  1000ms 内存限制:   65536kB 描述 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入 一行,一个字符串(长度不超过200), ...

  7. String的高级用法(String.Format)

    string.Format C#的String.Format的一般地我们可以直接使用string.format()或int.ToString()和float.ToString() 下面是一些Strin ...

  8. python魔法函数的一些疑问

    看了魔法函数,有一点疑问.1中需要用self.word才能执行,而2直接用self就可以执行.而1中Word继承了int基本类型,但在__new__时并没有什么卵用.当用 Word(“123”)来实例 ...

  9. swift中第三方网络请求库Alamofire的安装与使用

    swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面 ...

  10. JQuery常用方法(均实践过)

    1,使用jquery修改html元素的值 a,修改form的action的值(即修改html的属性值) 这个可以扩展为修改html元素的属性值的方法,使用的$("#id").att ...