Java -- 单例设计模式

Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。

1,饿汉式---在类初始化时,已经自行实例化

public class Person{
     private static final Person person=new Person();
     //私有构造函数,外界无法使用
    private Person(){
    }

    //提供一个方法,获得对象
    public static Person getPerson(){
         return person;
    }
}

注:饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

缺点:饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,

2,懒汉式(线程不安全)--顾名思义,什么时候用,什么时候创建

public class Person{
    private static Person person;
    //私有构造函数
    private Person(){
    }
    public static Person getPerson(){
        if(person==null){
            person=new Person();
        }
        return person;
    }

3,懒汉式(线程安全)

public class Person{
      private static Person person=null;
      
      private Person(){
      }
      //添加 synchronized 同步锁
      public static synchronized Person getPerson(){
      if(person==null){
          person=new Person();
      }
      return person;
      }
}

注:在2.懒汉式基础上,添加同步锁,使得在多线程中可以使用。例如:当两个线程同时想创建实例,由于同一时刻只有一个线程能够得到同步锁,当第一个线程得到后第二个线程只能等待,如果没有创建该实例,就会创建。第一个线程释放同步锁以后第二个线程才能加上同步锁,执行内部代码,由于第一个线程已经创建了实例,所以第二个线程不需要重复创建。保证了多线程环境下也只有一个实例。

缺点:每次通过 getPerson() 方法得到实例的时候都会有一个试图去获取同步锁的过程,然而加锁是很耗时的,所以能避免就避免。

4,懒汉式(双重锁,线程安全)

public class Person{
      private static Person person=null;
      private Person(){
      }

      public static Person getPerson(){
            if(person==null){
                synchronized(Person.class){
                      if(person==null){
                            person=new Person();
                       }
                 }
            }
            return person;
      }
}

注:只有在person==null的时候,才需要获取同步锁,创建一次实例。当实例被创建,则无需试图加同步锁,避免3中的问题。

缺点:使用双重if判断,复杂,容易出错。

5,静态内部类(建议使用)

public class Person{
      private Person(){
      }
      /** 
        * 静态初始化器,由JVM来保证线程安全 
        */ 
      private static class SingletonPerson{
            private final static Person person=new Person();
      }

      public static Person getPerson(){
            return SingletonPerson.person;
      }
}

注:上面的SingletonPerson内部类的实例与外部类的实例没有绑定关系,只有被调用才会被加载,也就是实现了延时加载。即按需创建实例。

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

推荐阅读更多精彩内容

  • 1.应用场景: 当需要保证类在内存中的对象唯一性,可以使用单例模式,不想创建多个实例浪费资源,或者避免多个实例由于...
    发光的鱼阅读 254评论 0 0
  • 单例是应用开发中一种设计模式,主要应用场景为:当且仅当系统中只能保留一个对象时使用。本文提出4中可以在生产环境中使...
    疯狂的冰块阅读 368评论 0 3
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,143评论 4 34
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 6,444评论 12 65
  • 一位超市里偷鸡腿的母亲成了儿童节期间最热门的新闻,穿着寒酸,携着病孩,偷一袋杂粮聊以糊口,一只鸡腿和一本儿童读物是...
    二双阅读 217评论 0 0