单例模式,今天你用了嘛

连载文章

1.前言

提起设计模式,可能大家有些人会感觉陌生,有些人会觉得经常使用。其实说到设计模式,不用感到陌生与害怕,其实我们每天在不经意间都在或多或少的使用或者接触设计模式。这篇文章就是想带大家了解最基础的设计模式,单例模式!

2.简介

单例模式是指,有且只有一个该类的实例化对象,并且实例化过程由这个类自己实现。该类的构造函数是私有化的。

3.常见的几种单例模式

饿汉式单例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 15:48
 * 描述:饿汉式单例模式
 * 优点:1.空间换时间,每次都直接加载,节约了创建实例的时间
 * 缺点:1.因为不管是否用到了该类,都会直接创建实例,所以在不使用的情况下,就浪费了空间
 */

public class HungrySingleton {
    private static HungrySingleton sSingleton = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){
        return sSingleton;
    }
}

懒汉式单例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 15:45
 * 描述:懒汉式单例模式
 * 优点:1.时间换空间,在调用的时候才创建实例,节约了空间
 *      2.每次getInstance的时候才创建实例,节约了资源
 *
 * 缺点:1.每次在调用的时候才创建实例,有点浪费时间
 *      2.每次调用getInstance都需要线程同步,造成不必要的开销
 */

public class LazySingleton {
    private static LazySingleton sSingleton;

    private LazySingleton(){}

    public static synchronized LazySingleton getInstance(){
        if (sSingleton==null){
            sSingleton=new LazySingleton();
        }

        return sSingleton;
    }
}

DCL(Double Check Lock)单例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 16:16
 * 描述:DCL(Double Check Lock)单例模式
 * 优点:1.在懒汉式的基础上进行了判断,只有在第一次创建实例的时候才会,进行线程同步操作。资源利用率高
 * 缺点:1.高并发情况下会出现问题
 *      2.JDK5之前会出现问题。由于Java编译器允许处理器乱序执行,JDK之前JMM中Cache寄存器到主内存回写顺序的规定,可能1-2-3,也可能1-3-2,所以可能JDK1.5之前出现问题
 *      (1)给DclSingleton分配内存
 *      (2)调用DclSingleton()的构造函数,初始化成员字段;
 *      (3)将mSingleton指向分配的内存空间(此时mSingleton不为null)
 *      3.在JDK5之后,Java使用了新的内存模型JSR-133,它增强了volatile的内存语义。使用volatile修饰的对象,不会出现(2)中出现的问题
 */

public class DclSingleton {
    private static volatile DclSingleton mSingleton=null;
    private DclSingleton(){}

    public static DclSingleton getInstance(){
        if (mSingleton==null){
            synchronized (DclSingleton.class){
                if (mSingleton==null){
                    mSingleton=new DclSingleton();
                }
            }
        }

        return mSingleton;
    }
}

静态内部类单例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 16:14
 * 描述:静态内部类单例模式
 * 优点:1.保证了线程安全问题,也能保证单例的唯一性(推荐)
 * 缺点:
 */

public class StaticSingleton {
    private StaticSingleton(){}

    private static StaticSingleton getInstance(){
        return StaticSingletonHolder.sSingleton;
    }

    private static class StaticSingletonHolder{
        private static final StaticSingleton sSingleton=new StaticSingleton();
    }
}

4.后续

上面例举了几种常见的单例模式,其中本人最为常用的是静态内部类单例模式。当然这四种并不是所有的单例模式,还有枚举单例模式,以及使用Map容器实现的单例模式。如果是想直接找一个单例模式使用的话,那就直接复制代码就好。如果想知道他们的优缺点的话,就可以看下注释。还是那句话风里雨里在这里等你,您的一个赞或者收藏就是我写下去的动力,希望大家共同进步。如有错误请及时提出我也好改正。
另附GitHub源码地址:https://github.com/13046434521/DesignPatterns

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

推荐阅读更多精彩内容

  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,512评论 1 8
  • 1.单例模式概述 (1)引言 单例模式是应用最广的模式之一,也是23种设计模式中最基本的一个。本文旨在总结通过Ja...
    曹丰斌阅读 2,920评论 6 47
  • 【学习难度:★☆☆☆☆,使用频率:★★★★☆】直接出处:单例模式梳理和学习:https://github.com/...
    BruceOuyang阅读 673评论 1 2
  • 概述 单例模式是应用最广的模式之一,在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要...
    刘涤生阅读 1,022评论 0 5
  • 萧萧冬雪之后,春带着各种礼物来赶赴约会。 她身穿绿色的礼服,一路播种为大地妈妈织嫩绿新衣的草丝,在热闹的宴...
    Yfickgoviv阅读 177评论 2 2