首页 > 其他分享 >浅谈单例模式的几种实现

浅谈单例模式的几种实现

时间:2022-12-12 21:57:36浏览次数:46  
标签:Singleton 浅谈 private 几种 instance static 单例 public

 

单例模式(来自菜鸟教程)

单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式的要求

  • 构造方法必须私有化(确保只有自己能创建)
  • 以静态方法返回实例(外界不能通过new来获取到对象)
  • 确保对象实例只有一个(只对类进行一次实例化,以后都直接获取第一次实例化的对象)

单例模式的实现

1、懒汉式(线程不安全)

描述:这种方式是最基本的实现方式,但是不支持多线程。因为没有加锁,在多线程不能正常工作

//懒汉式(线程不安全)
public class Singleton {  
    private static Singleton instance;  

    private Singleton (){}  
  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

2、懒汉式(线程安全)

描述:能够在多线程下正常工作,但是,效率极低

//懒汉式(线程安全)
public class Singleton {  
    private static Singleton instance;  

    private Singleton (){}  

    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

3、双重校验锁(DCL,即double-checked locking)(线程安全)

描述:对懒汉式(线程安全)的优化,采用双锁的机制,安全且在多线程情况下能保持高性能

//双重校验锁
public class Singleton {
    private volatile static Singleton instance;

    private Singleton() {

    }

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

4、饿汉式(线程安全)

描述:这种方式比较常用,但容易产生垃圾对象

//饿汉式
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {

    }

    public static Singleton getInstance() {
        return instance;
    }
}

5、静态内部类(线程安全)

描述:这种方式达到跟双重校验锁一样的效果,这种方式只适用于静态域的情况,双重校验锁可在实例域需要延迟初始化时使用

//静态内部类
public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {

    }

    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

6、枚举(线程安全)

描述:这种方式还没有被广泛采用,但是这种实现是单例模式的最佳方法。更简洁、自动支持序列化机制、绝对防止多次实例化

//枚举
public enum Singleton {
    INSTANCE;

    public void whateverMethod() {

    }
}

总结

一般情况下,不建议使用第1种和第2种懒汉方式,建议使用第4种饿汉方式。只有在明确实现lazy loading时,才会使用第5种静态内部类方式。如果涉及到反序列化创建对象时,可以使用第6种枚举方式。如果有其他需求,可以考虑使用第3种双重校验锁方式。

 

PS:开始面临着春招,好多面经都有说到设计模式。最常见的面试题就是讲一讲单例模式的实现和理解,所以我写一下,加深我对单例模式的理解和印象。觉得对你有帮助的话可以点点赞,谢谢啦~~~

标签:Singleton,浅谈,private,几种,instance,static,单例,public
From: https://www.cnblogs.com/shoshana-kong/p/16977200.html

相关文章

  • JAVA 单例模式 饿汉和懒汉
    单例模式特点:①单例类只能有一个实例②私有构造方法,不允许通过其他类创建单例类的实例③提供静态get方法返回单实例饿汉式:类加载的时候就创建实例懒汉式:类加载时不创建......
  • StatusBar on Dialogs-在VC中为作为主窗口的对话框添加状态栏的几种方法
    感谢CSDN论坛上的Featured(我握着爱情的门票静静排队……)提供了一个演示程序的下载链接:​​http://www.bypro.net/PostAttachment.aspx?PostID=21994&AttachmentID=18......
  • 浅谈电能管理系统在某轧钢厂的应用
    罗轩志安科瑞电气股份有限公司 上海嘉定 201801 摘要:结合某轧钢厂的现状和电能管理软件的优势应用,在节能降耗方面利用电能管理软件对轧钢厂电能损耗进行实时监控,为实现......
  • 浅谈电能预付费系统在物业客户中的设计及应用
    罗轩志安科瑞电气股份有限公司上海嘉定201801【摘要】随着我国供电企业的不断发展,而用电模式也在不断改革,预付费技术在气、电等部门得到普遍的使用,本文主要针对预付费系......
  • 浅谈字节码增强技术系列1-字节码增强概览
    作者:董子龙前言前段时间一直想参照lombok的实现原理写一篇可以生成业务单据修改记录插件的专利,再查阅资料的过程中,偶然了解到了字节码增强工具-byteBuddy。但是由于当时时间......
  • 浅谈古建筑电气火灾的防控与管理
    罗轩志安科瑞电气股份有限公司 上海嘉定201801摘要:我国古建筑多为砖木结构,当发生火灾事故时具有蔓延快、扑救难的特点,而火灾对古建筑的损害性很大,电气火灾事故在我国火灾......
  • 《激励》读后浅谈--结合自己的一些实际管理经验讲点能懂的话
        人力资源是一个企业最重要的资源之一,其也可以作为公司核心竞争的重要因素。    公司要发展取决于人,所以公司员工的素质和活力是一个企业的根本动力,也是一个企业......
  • 单例模式有几种写法?
    纠结单例模式有几种写法有用吗?有点用,面试中经常选择其中一种或几种写法作为话头,考查设计模式和codingstyle的同时,还很容易扩展到其他问题。这里讲解几种笔者常用的写法,但......
  • java list泛型简单的几种转换
     1.List<String>转 List<integer>、List<Long>1importjava.util.ArrayList;2importjava.util.List;3importjava.util.stream.Collectors;45publi......
  • 线段简化的几种算法
    翻译自:https://www.codeproject.com/Articles/114797/Polyline-Simplification#headingDPN参考:https://www.codeproject.com/Articles/114797/Polyline-Simplification......