单例模式


单例模式

  • 单例模式的核心作用
    保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
  • 常见应用场景
    Windows的任务管理器和回收站,读取配置文件的类一般也只有一个对象,网站的计数器,应用程序日志应用实现,数据库连接池的设计,操作系统的文件系统,Servlet中的Application,Spring中每个Bean默认是单例,Servlet编程中每个Servlet也是单例,SpringMVC和struts1中控制器对象也是单例。
  • 单例的优点
    当一个对象的产生需要比较多的资源时,可以通过在应用启动时直接产生一个单例对象,然后通过永久驻留内存的方式解决;可以在系统设置全局的访问点,优化共享资源访问,如负责所有数据表的映射处理。
  • 常见五种实现形式:
  1. 饿汉式(线程安全,调用效率高,不能延时加载)
public class A{
 private static A a = new A();//类初始化时,立即加载这个对象
 private A(){}
 public static A getInstance(){return a;}
}

饿汉式单例中,static变量会在类装载时初始化,也不会涉及多个线程对象访问该对象的问题,虚拟机保证只会装载一次该类,不会发生并发访问问题。可以省略synchronized。但是如果只是加载本类,而不是要调用getInstance方法,会造成资源浪费!

  1. 懒汉式(线程安全,效率不高,可以延时加载
public class A{
 private static A a;
 private A(){}
 public static synchronized A getInstance(){
  if(a==null){a = new A();}
  return a;
 }
 
}

lazyload:延时加载,懒加载,真正用的时候加载。每次调用getInstance方法都要同步,并发效率低。

  1. 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题
    这个模块将同步内容放到了if内部,提高了执行效率,不必每次获取对象时都进行同步,只有第一次才同步。
  2. 静态内部模式(线程安全,效率高,可以延时加载
    静态内部类实现方式(也是一种懒加载方式):
public class A{
private static class AInstance{
private static final A a = new A();
}
public static A getInstance(){return AInstance.a;}
private A(){}
}

外部类没有static属性,不会立即加载对象。只有真正调用getInstance方法才会加载匿名内部类,兼备了并发高效调用和延时加载。

  1. 枚举单例(线程安全,效率高,不能延时加载
public enum A{INSTANCE;//一个枚举元素,它就代表了Singleton的一个实例
public void AOperation(){//功能处理}
}//单例可以有自己的操作

优点:实现简单,枚举本身就是单例模式(由JVM从根本上提供保障,避免反射和反序列化的漏洞)。
缺点:无延时加载。


  • 单例模式存在的问题
  1. 防止反射:在构造方法中手动抛出异常控制
    private A(){if(a!=null){throw new RuntimeException();}}
  2. 防止反序列化:在单例类中建一个新方法
    private Object readResolve() throws ObjectStreamException{return a;}
    反序列化时,定义了此方法则直接返回此方法制定的对象,而不会单独创建新对象。
  • 多线程环境下效率由高到低:
    饿汉式 > 静态内部类式 > 枚举式 > 双重检查锁式 > 懒汉式
    选用:单例对象占用资源少,不需要延时加载:枚举式>饿汉式。
    单例对象占用资源大,需要延时加载:静态内部类式>懒汉式。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容