专栏首页Java阿呆单例模式(Singleton Pattern)

单例模式(Singleton Pattern)

单例模式是最简单的设计模式之一,这种设计模式是一种创建型的模式,提供了创建对象的最佳方式。

单例模式顾名思义就是一个类只允许创建一个实例,因此它只涉及到一个单一的类,并且这个类要完成自己创建自己的实例的工作,并保证能且只能创建一个实例。这个类还需要提供一个访问这个实例的方法。

接下来我们分析一下单例模式的多种实现方式。(以下代码均为Java实现,若读者有兴趣可自行用其他语言实现)

一、懒汉模式(延迟加载)

public class Singleton{
    //定义一个未初始化的私有静态对象,外部不可访问
    private static Singleton singleton;

    //构造私有,保证外部不可创建实例
    private Singleton() {
    }

    //提供公有方法获取实例
    public synchronized static Single newInstance() {
        if (singleton== null) {
            //如果singleton为空就为其创建实例
            singleton= new Singleton();
        }
        //将创建好的实例返回
        return singleton;
    }
}

懒汉形式是标准的单例实现形式,它的延迟加载体现在newInstance方法里的判断,方法加了synchronized关键字可以避免多线程问题,但会影响程序性能。

二、饿汉模式(贪婪加载)

public class Singleton {
    //直接创建私有静态实例
    private static Singleton singleton= new Singleton();

    //构造方法私有保证外部不可创建实例
    private singleton() {
    }

    public static Singleton newInstance() {
        //将创建好的实例返回
        return singleton;
    }
}

在单例对象声明的时候就直接初始化对象,可以避免多线程问题,但是如果对象初始化比较复杂,会导致程序初始化缓慢。

三、双重锁检查

public class Singleton {
    //静态对象用volatile关键字修饰
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton newInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

这个是懒汉形式的加强版,将synchronized关键字移到了newInstance方法里面,同时将singleton对象加上volatile关键字,这种方式既可以避免多线程问题,又不会降低程序的性能。但volatile关键字也有一些性能问题,不建议大量使用。

四、Lazy initialization holder class

public class Singleton {
    private static class SingletonHolder {
        private static Singleton singleton = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton newInstance() {
        return SingletonHolder.singleton;
    }
}

这种方法创建了一个内部静态类,通过内部类的机制使得单例对象可以延迟加载,同时内部类相当于是外部类的静态部分,所以可以通过jvm来保证其线程安全。这种形式比较推荐。

还有一些其他的方法有待学习探索,正所谓学无止境,与君共勉。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ConcurrentHashMap基础

    ConcurrentHashMap作为Concurrent一族,其有着高效地并发操作,相比Hashtable的笨重,ConcurrentHashMap则更胜一筹...

    Java阿呆
  • ConcurrentHashMap源码(二)

    删除元素跟添加元素一样,都是先找到元素所在的桶,然后采用分段锁的思想锁住整个桶,再进行操作。

    Java阿呆
  • 使用Jedis远程连接Redis时的小插曲

    从Maven依赖库库中下载两个jar包,分别是commons-pool2-2.4.2.jar和jedis-2.9.0.jar,版本不作要求。将这个两个jar包导...

    Java阿呆
  • 单例模式以及七种实现方式

    通过两个判断,第一层是避免不必要的同步,第二层判断是否为null。 可能会出现DCL模式失效的情况。 DCL模式失效: singleton=new Single...

    用户6182664
  • 单例模式-唯一实例

    其实这样写是可以的,但是会影响效率。当一个实例创建之后,再次进行这个方法的调用,会进行加锁,然后返回这个实例

    杨小杰
  • 单例设计模式总结

    最近看到一篇关于单例模式较为详细的讲解的文章:https://coolshell.cn/articles/265.html 下面对此文章进行摘录 (Java)

    xuyaowen
  • windows下python使用pip命令安装builtwith库时,遇到的utf-8问题的解决

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

    zy010101
  • Java虚拟机详解(一)------简介

      本系列博客我们将以当前默认的主流虚拟机HotSpot 为例,详细介绍 Java虚拟机。以 JDK1.7 为主,同时介绍与 JDK1.8 的不同之处,通过Or...

    IT可乐
  • 谷歌正式抛弃HTTP,7月起全部标示为不安全

    源 | 程序员头条 据国外媒体 Venturebeat 报道,谷歌近日宣布,今年 7 月起,Chrome 浏览器的地址栏将把所有 HTTP 标示为不安全网站。...

    顶级程序员
  • Kubernetes 管理虚拟机之 KubeVirt

    Kubevirt 是Redhat开源的以容器方式运行虚拟机的项目,以k8s add-on方式,利用k8s CRD为增加资源类型VirtualMachineIns...

    YP小站

扫码关注云+社区

领取腾讯云代金券