java单例模式常见的几种写法(代码片段)

wen-pan wen-pan     2022-12-02     289

关键词:

单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全

  • 懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题
  • 饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全

一、饿汉模式

public class Singleton1 

    /**
     * 饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化)
     */
    private final static Singleton1 INSTANCE = new Singleton1();

    /**
     * 禁止外部实例化
     */
    private Singleton1() 

    

    public static Singleton1 getInstance() 
        return INSTANCE;
    

二、懒汉模式(线程不安全)

public class Singleton2 

    /**
     * 即使是类被主动使用,也不会触发INSTANCE的创建
     */
    private static volatile Singleton2 INSTANCE = null;

    /**
     * 禁止外部实例化
     */
    private Singleton2() 

    

    /**
     * 当调用getInstance方法获取单例对象时再创建单例对象,当INSTANCE为空时才创建
     * 这种是线程不安全的
     */
    public static Singleton2 getInstance() 
        if (INSTANCE == null) 
            INSTANCE = new Singleton2();
        
        return INSTANCE;
    

三、懒汉模式(线程安全)

public class Singleton6 

    private static volatile Singleton6 INSTANCE = null;

    /**
     * 禁止外部实例化
     */
    private Singleton6() 

    

    public static Singleton6 getInstance() 
      	// 通过加锁保证线程安全,但是性能会相应的降低
        synchronized (Singleton6.class) 
            if (INSTANCE == null) 
                INSTANCE = new Singleton6();
            
            return INSTANCE;
        
    


四、双检锁单例

public class Singleton3 

    /**
     * 注意这里需要用volatile去修饰,以避免指令重排代理的多线程安全问题
     */
    private static volatile Singleton3 INSTANCE = null;

    /**
     * 禁止外部实例化
     */
    private Singleton3() 

    

    public static Singleton3 getInstance() 
        // 两次检查,线程安全
        if (INSTANCE == null) 
            synchronized (Singleton3.class) 
                if (INSTANCE == null) 
                    INSTANCE = new Singleton3();
                
            
        
        return INSTANCE;
    


五、静态内部类写法

public class Singleton4 

    /**
     * 禁止外部实例化
     */
    private Singleton4() 

    

    public static Singleton4 getInstance() 
        // 外部内可以访问静态内部类的私有成员变量
        return Holder.instance;
    

    /**
     * 静态内部类实现单例模式,只有在Holder类被主动使用时才会触发Holder类的加载,从而触发instance的实例化,
     * 并且是由JVM去实例化的保证线程安全,所以这种模式也是线程安全的懒汉模式
     */
    static class Holder 
        /**
         * 静态内部类里持有一个Singleton4的单例对象
         */
        private static Singleton4 instance = new Singleton4();
    

六、枚举写法

public enum Singleton5 

    /**
     * 单例对象,枚举实现单例,写法就很简单了,并且能保证线程安全(枚举类是由JVM加载),但枚举是饿汉模式
     */
    INSTANCE;

    /**
     * 提供一个获取枚举对象的方法
     */
    public Singleton5 getInstance() 
        return INSTANCE;
    

单例模式(下)---聊一聊单例模式的几种写法(代码片段)

在上一篇文章单例模式(上)—-如何优雅地保证线程安全问题中,我们采取了懒汉式写法来写我们的单例模式,并且重点讲解了懒汉式中线程安全的问题。这篇我们来讲讲单例模式中的其他几种写法。上篇文章中,方法和变量的声... 查看详情

常见的几种单例模式(代码片段)

  单例模式:是一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。  对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以... 查看详情

关于单利模式的几种实现方式(代码片段)

单例模式是java中非常常见的一种设计模式,也是java学习中很热门的一个知识模块,今天就和大家一起来了解一下单例模式和单例模式的几种实现方式。  单例模式的定义:  单例模式是指某个类只有一个实例,并... 查看详情

javase面试题——singleton单例模式的几种写法(代码片段)

...ff01;!!我们都知道,在23种设计模式中,单例模式是最容易理解、最简单的一种了,它也是软件开发中最常用的设计模式之一了。单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使... 查看详情

单例模式的几种写法

1、静态初始化/**饿汉式类加载到内存后,就实例化一个单例,jvm保证线程安全简单实用,推荐使用唯一缺点:不管用到与否,类加载时就完成实例化(话说你不用的,你转载它干啥)一般这种就够用了*/publicclassMgr01{privatestaticfin... 查看详情

单例模式的几种写法(代码片段)

...态变量保存8*(3)向外提供这个实例9*(4)强调这是一个单例,用static关键字修饰10*/11publicclassSingleton112publicstaticfinalSingleton1INSTANCE=newSingleton1();1314privateSingleton1()151617也可以采用枚举类的方式1packagesingle;23/**4*使用枚举的方式设计... 查看详情

单例模式的几种写法的差异

设计模式:单例模式的几种写法的差异1.单例模式的概念单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类... 查看详情

单例模式的几种写法

懒汉式饿汉式就不多说了体会代码 都不能防止反射机制攻击和反序列化 publicclassSingleton{privatestaticfinalSingletonMYINSTANCE=newSingleton();privateSingleton(){super();}publicstaticSingletongetInstance(){returnMYINSTANCE;}}/ 查看详情

单例模式的几种写法

饿汉式单例类public class Singleton  {      private Singleton(){            }  &nb 查看详情

单例模式的几种写法

1首先要知道,什么叫做单例模式。单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例2单例模式简介单例模... 查看详情

java常见的几种设计模式

...设计经验的总结; 2)分类: 创建型模式(创建对象的): 单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。 行为型模式(对象的功能): 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式... 查看详情

100个unity小知识点|unity中常用的几种单例写法(代码片段)

...来专业制作游戏!Unity小知识点学习Unity中常用的几种单例写法单例模式(SingletonPattern)保证一个类仅有一个实例,并提供一个访问它的全局访问点单例模式优点单例模式核心在于对于某个单例类,在系统中同时只存在... 查看详情

100个unity小知识点|unity中常用的几种单例写法(代码片段)

...来专业制作游戏!Unity小知识点学习Unity中常用的几种单例写法单例模式(SingletonPattern)保证一个类仅有一个实例,并提供一个访问它的全局访问点单例模式优点单例模式核心在于对于某个单例类,在系统中同时只存在... 查看详情

常见的几种单例模式

单例模式?:系统运行期间,有且仅有一个实例!  1:它必须自行创建这个实例(定义了静态的该类私有对象) 2:一个类只有一个实例(只提供私有构造器(核心)) 3:它必须自行向整个系统提供这个实例(提供一个静态... 查看详情

常见的几种单例模式

转载自:https://www.cnblogs.com/Ycheng/p/7169381.html单例模式:是一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。  对于系统中的某些类来说,只有一... 查看详情

线程安全的单例模式的几种实现

单例模式是一种常见的设计模式;JavaSingleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbagecollection)。 单例模式也是一种比较常见的设... 查看详情

实现单例模式的几种方式(代码片段)

  import 是Python中的天然单例模式,我最先推荐这种方式。  创建两个文件 signletion.py signletion_import.py,文件内容如下classUser():def__new__(cls,*args,**kw):print("newinstance")returnsuper().__new__(cls,*args,**kw)defg 查看详情

手撕几种常见单例模式(代码片段)

手撕几种常见单例模式1.单例模式特点2.静态内部类单例模式3.双检索单例模式4.其余单例参考下述超详细的链接1.单例模式特点定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。常见的使用场景:线... 查看详情