创建型模式之单例模式

微信小程序内容安全审核:从API调用到工程化落地的全流程实践 内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异 阅读详情

1、什么是单例模式

确保一个类只有一个实例,并提供该实例的全局访问点。

使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。

私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。

2、单例模式的代码实现

1、饿汉式 - 线程安全(不推荐)

线程不安全问题主要是由于 uniqueInstance 被实例化多次,采取直接实例化 uniqueInstance 的方式就不会产生线程不安全问题。

但是直接实例化的方式也丢失了延迟实例化带来的节约资源的好处。

public class Singleton {

    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        return uniqueInstance;
    }
}

2、懒汉式 - 线程不安全(不推荐)

私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,就不会实例化 uniqueInstance,从而节约资源。

这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if (uniqueInstance == null) ,并且此时 uniqueInstance 为 null,就会有多个线程执行 uniqueInstance = new Singleton(); 语句,这将导致实例化多次 uniqueInstance。

public class Singleton {

    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

3、懒汉式 - 线程安全(不推荐)

直接对 getUniqueInstance() 方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了实例化多次 uniqueInstance。

但是当一个线程进入该方法之后,即使 uniqueInstance 已经被实例化了,其它试图进入该方法的线程也必须等待。这会让线程阻塞时间过长,因此该方法有性能问题,不推荐使用。

public class Singleton {

    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static synchronized Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
	}
}

4、双重校验锁 - 线程安全(推荐)

uniqueInstance 只需要被实例化一次,之后就可以直接使用了。只有当 uniqueInstance 没有被实例化时,才需要对实例化部分的代码进行加锁。

双重校验锁先判断 uniqueInstance 是否已经被实例化,如果没有被实例化,那么才对实例化语句进行加锁。

public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

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

考虑下面的实现,也就是只使用了一个 if 语句。在 uniqueInstance == null 的情况下,如果两个线程都执行了 if 语句,那么两个线程都会进入 if 语句块内。虽然在 if 语句块内有加锁操作,但是两个线程都会执行 uniqueInstance = new Singleton(); 这条语句,只是先后的问题,那么就会进行两次实例化。因此必须使用双重校验锁,也就是需要使用两个 if 语句:

第一个 if 语句用来避免 uniqueInstance 已经被实例化之后的加锁操作,

第二个 if 语句进行了加锁,所以只能有一个线程进入,就不会出现 uniqueInstance == null 时两个线程同时进行实例化操作。

if (uniqueInstance == null) {
    synchronized (Singleton.class) {
        uniqueInstance = new Singleton();
    }
}

uniqueInstance 采用 volatile 关键字修饰也是很有必要的, uniqueInstance = new Singleton(); 这段代码其实是分三步执行:

  1. 为 uniqueInstance 分配内存空间
  2. 初始化 uniqueInstance
  3. 将 uniqueInstance 指向分配的内存地址

但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。

使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。

5、静态内部类实现 - 线程安全(推荐)

当 Singleton 类被加载时,静态内部类 SingletonHolder 没有被加载进内存。只有当调用 getUniqueInstance() 方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例,并且 JVM 能确保 INSTANCE 只被实例化一次。

这种方式不仅具有延迟初始化的好处,而且由 JVM 提供了对线程安全的支持。

public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

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

5、枚举实现 - 线程安全(《Effective Java》的作者 Josh Bloch 提倡的方式)

该实现可以防止反射攻击。在其它实现中,通过 setAccessible() 方法可以将私有构造函数的访问级别设置为 public,然后调用构造函数从而实例化对象,如果要防止这种攻击,需要在构造函数中添加防止多次实例化的代码。该实现是由 JVM 保证只会实例化一次,因此不会出现上述的反射攻击。

该实现在多次序列化和序列化之后,不会得到多个实例。而其它实现需要使用 transient 修饰所有字段,并且实现序列化和反序列化的方法。

public class Singleton {
    //私有化构造函数
    private Singleton(){ 
    }
 
    //定义一个静态枚举类
    static enum SingletonEnum{
        //创建一个枚举对象,该对象天生为单例
        INSTANCE;
        private Singleton Singleton;
        //私有化枚举的构造函数
        private SingletonEnum(){
            Singleton=new Singleton();
        }
        public Singleton getInstnce(){
            return Singleton;
        }
    }
 
    //对外暴露一个获取User对象的静态方法
    public static Singleton getInstance(){
        return SingletonEnum.INSTANCE.getInstnce();
    }
}

6、如何防止反射、克隆、序列化对单例模式的破环

1、防止反射破环(虽然构造方法已私有化,但通过反射机制使用newInstance()方法构造方法也是可以被调用):

  • 首先定义一个全局变量开关isFristCreate默认为开启状态
  • 当第一次加载时将其状态更改为关闭状态

2、防止克隆破环

  • 重写clone(),直接返回单例对象

3、防止序列化破环

  • 添加readResolve(),返回Object对象
public class Singleton implements Serializable,Cloneable{
    private static final long serialVersionUID = 6125990676610180062L;
    private static volatile Singleton singleton;
    // 防止反射破环,标志位默认是 true
    private static boolean isFristCreate = true; 
    
    private Singleton(){
            if (isFristCreate) {
                synchronized (Singleton.class) {
            if (isFristCreate) {
              isFristCreate = false;
            }
                }
            }else{
                throw new RuntimeException("已然被实例化一次,不能在实例化");
            }
    }
    
    public  static Singleton getInstance(){
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
    
    @Override
    protected Singleton clone() throws CloneNotSupportedException {
        return singleton;
    }
    
    private Object readResolve() {
        return singleton;
    }
}
【BlueDroid】【PBAP】蓝牙电话本协议之同步通讯录分析(超详细) Header - Type = "x-bt/vcard-listing":代表了该Request对应的Function为PullvCardListing;Profile:PBAP (4),上层应用层协议为PBAP,OBEX协议的上层应用层协议除了PBAP,还有OPP、MAP协议;Response in Frame:该request frame-485对应的Response frame为489;在PBAP协议同步通讯录和通讯记录中,都是基于OBEX协议实现的,PBAP协议作为了应用层协议; 阅读详情

相关推荐

中国1990-2021连续30年土地利用CLCD数据分享

CLCD(China Land Cover Dataset)数据集是由武汉大学黄昕老师基于Google Earth Engine上的335,709景Landsat数据制作的中国年度土地覆盖数据集。为了提高CLCD的时空一致性,还提出了一种包含时空滤波和逻辑推理的后处理方法。该数据集最大的优势在于每年30米的土地利用分类结果,且连续覆盖了30年时间。相比其他产品如GLC_FCS30、Global30、AGLC2000_2015、FROM-GLC10、ESA10、ESRI10等,CLCD在时间分辨率上更高。

qq_48539301的博客 1万+

设计模式 - 创建型模式_ 单例模式 Singleton Pattern

单例模式常见的写法有: 懒汉式单例,饿汉式单例,登记式单例(可忽略)。单例模式特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一对象实例 单例模式确保某各类只有一个实例,而且自行实例化并向整个系统提供这个实例。比如我们常见的线程池 、缓存等等。选择单例模式就是为了避免不一致的状态,避免政出多头。懒汉式单例 特点: - 懒汉式单例在第一次调用的时候

小工匠 3万+

用STM32的SPI接口读取MT6835磁编码器,手把手教你避开数据读取的坑

本文详细介绍了如何使用STM32的SPI接口读取MT6835磁编码器,并提供了21个实战细节与避坑指南。从硬件连接、SPI配置到数据解析和实时调试,全面解析了读取位置信息过程中的常见问题及解决方案,帮助工程师在工业控制、伺服电机等场景中高效应用AMR技术。

weixin_30729609的博客 1441

设计模式 ~ 创建型模式 ~ 单例模式 ~ Singleton Pattern。

设计模式 ~ 创建型模式 ~ 单例模式 ~ Singleton Pattern。

lyfGeek的博客 403

关于solidworks无法获得下列许可SOLIDWORKS Standard的解决方法

在使用solid works的时候,出现无法获得下列许可SOLIDWORKS Standard,刚开始还以为软件出了问题,经过一方折腾找到了解决方法。希望这个方法可以帮助到您 找到这个服务 问题到这里就已经得到了解决,但更大的问题是,要是每次遇见这种都要这么麻烦,岂不是很累?这里也提供一种方法。考虑到每个人的情况,下面说的可能有一点啰嗦。 !!!!!!注意那个在此期间之后重新启动服...

Chaosna13的博客 7万+

KBS投稿全流程拆解:从模板准备到条件接收的实战指南

本文详细拆解了KBS期刊投稿的全流程,从模板准备、投稿系统操作到返修策略和条件接收。重点介绍了Cover Letter撰写技巧、Latex模板选择、审稿周期管理以及返修文件的系统准备方法,帮助研究者高效完成KBS投稿并提升接收概率。

weixin_26938645的博客 707

创建型模式之单例模式(Singleton Pattern)

  单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。   单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。 单例模式的几种实现方式 1、懒汉式,线程不安全 这种方式是最基本的实现方式,这种实现最大的问题就...

衣人之衣者,怀人之忧;食人之食者,死人之事! 960

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2076

创建型模式——单例模式(Singleton Pattern)

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

qq_46658171的博客 894

微信小程序PC端兼容性实战:如何绕过限制在电脑上运行手机端小程序

本文详细解析了微信小程序在PC端的兼容性问题及解决方案,重点介绍了如何利用`wx.getSystemInfo`API检测运行环境,并通过修改User-Agent、动态环境检测与适配等技术手段实现手机端小程序在PC端的顺畅运行。文章还提供了常见兼容性问题的解决方法和调试工具推荐,帮助开发者高效应对多端适配挑战。

weixin_28366053的博客 870

vue3+vite:引入tailwindcss不生效的原因,详细解决Tailwind配置没问题但就是不生效的情况,配置正确无报错但样式没有生效(包括tailwindcss在Vue2使用不生效解决方案)

vue3 tailwind使用教程以及tailwind不生效的问题,vue3+vite引入tailwindcss不生效的原因,tailwindcss配之后不生效怎么办,如何解决tailwinscss不生效的原因,Vue3项目使用tailwindcss在Vue2使用,不生效解决,如何解决使用 Tailwind CSS 后出现的样式不生效的问题?tailwindcss配之后不生效 tailwindcss不生效,为什么我的 Tailwind css 类没生效,解决使用 Tailwind 时样式不生效的问题,配置没

✅ 精选推荐文章 4128

创建型模式--单例模式【Singleton Pattern】

单例模式定义 单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,且属于创建类模式。 Ensure that only one instance of a class is created. Provide a global point of access to the object. 单例模式类图 饿汉式单例 public...

thebigdipperbdx的博客 330

【FPGA教程案例59】深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

在课程,我们对的基本原理有了初步认识。在上一个课程,我们完成了CNN的Relu激活层、pool池化层、卷积层以及图像输入层的实现,如下图所示:在本课程中,我们将上述四个模块结合起来,构建一个简单的CNN卷积神经网络。...

FPGA/MATLAB学习教程/源码/项目合作开发 2637

创建型-单例模式(Singleton Pattern)

双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session 工厂等)枚举类实现单例模式是唯一一种不会被破坏的单例实现模式。输出结果为false。

babstyt的博客 972

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

设计模式之创建型模式——单例模式(Singleton pattern)

创建型模式——单例模式(Singleton pattern) 定义 当你的项目需要某一个类的实例化对象只有一个的时候,可以使用单例模式。单例模式因为只创建一个实例化对象,所以使用上更便利,性能和空间都能得到优化,但缺点是因为实例化只有一个导致类与类之间耦合性增加,并且还需要考虑线程安全的问题。 示例 /** * 单例设计类 */ public class Singleton { pri...

小迷糊的守护神 307

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

单例模式(Singleton Pattern)【创建型】

C#设计模式之一单例模式(Singleton Pattern)【创建型】 原文:C#设计模式之一单例模式(Singleton Pattern)【创建型】 一、引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的、有关设计模式的文章。这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍。写作的过程中也会多看看其他大...

LJianDong的博客 212

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

创建型模式 - 单例模式

创建型模式 - 单例模式

qq_43350524的博客 857

单例模式(Singleton Pattern) – 设计模式之创建型模式

单例模式(Singleton Pattern) – 设计模式之创建型模式: 目录 单例模式(Singleton Pattern) 类图 单例实现方式: 饿汉: 懒汉: 双重校验锁: 静态内部类:比较推荐 枚举:推荐的方式 分析 总结: 使用场景 单例模式(Singleton Pattern) 定义:Ensure a class has only one instance, and provide a global point of access to it. 确保一个类只有一.

一路向前 461

创建型设计模式——单例模式

创建型设计模式,就是通过控制对象的创建方式来解决设计问题。

weixin_44050362的博客 791

03 创建型模式之单例模式(Singleton Pattern)

文章目录1 介绍1.1 单例模式结构1.2 单例模式的实现1.3 单例模式实现基本要求2 饿汉式2.1 静态变量方式2.2 静态代码块方式3 懒汉式3.1 方式1--线程不安全3.2 方式2--线程安全3.2 方式3--双重检查锁3.4 方式4(静态内部类方式)4 枚举方式实现5 破坏单例模式5.1 序列化方式破坏单例5.1.1 演示5.1.2 解决5.2 反射方式破坏单例5.2.2 解决 1 介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创

wyaoyao93的博客 278

【c++设计模式06】创建型4:单例模式(Singleton Pattern)

单例模式保证一个类只有一个实例,并且提供一个全局访问点来获取该实例。单例模式是一种创建型设计模式,用于确保一个类只有一个实例。它适用于需要控制资源共享访问权限的场景。单例模式可以分为懒汉式和饿汉式两种实现方式,并且需要注意线程安全性,可以使用互斥锁或双重检查锁定来保证线程安全。

junxuezheng的博客 1092

设计模式:创建型模式--单例模式(Singleton Pattern)

设计模式:创建者模式——单例模式 文章目录设计模式:创建者模式——单例模式1. 概念2. 组成结构3. 实现方式3.1 饿汉式3.1.1 静态变量3.1.2 静态代码块3.1.3 枚举方式3.2 懒汉式3.2.1 非线程安全3.2.2 线程安全3.2.3 双重检查锁3.2.4 静态内部类4. 存在问题4.1 序列化反序列化4.2 反射机制 1. 概念 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种

ZZay's 649

创建型设计模式: 单例模式(Singleton Pattern)

设计模式;结构型模式;创建型设计模式;单例模式(Singleton Pattern)保证一个类仅有一个实例,并提供一个访问它的全局访问点。Singleton模式属于创建型模式,创建型模式包括FactoryMethod模式,AbstractFactory模式,Singleton模式,ProtoType模式和Builder模式。

智能多媒体 408

三、单例模式(Singleton Pattern)——对象创建型模式

目录 1、单例模式的动机 2、单例模式的定义 3、单例模式的特点 4、单例模式的优点和缺点 5、单例模式的结构 6、单例模式的实现 7、单例模式的应用场景 1、单例模式的动机 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。 如何保证一个类只有一个实例并且这个实

qq_33509005的博客 623

【设计模式】创建型模式(三):单例模式

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

Data · Model · Agent · Repeat 1601

设计模式之创建型模式——单例模式

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

qq_40249026的博客 1179
上一篇: Git 切换关联的远程仓库
下一篇: 创建型模式之原型模式
☞十一
博客等级 码龄9年 8粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值