设计模式学习笔记1——单例模式

【算法】—前缀和与差分详解 前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。 阅读详情

单例模式(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

代码:https://github.com/duyilong/Design-pattern/tree/master/Singleton

  • 保证仅有一个实例:不允许随意new,将构造函数、复制构造函数、赋值运算符声明为私有private,注意,析构函数也要声明为私有。
  • 全局访问点:静态的GetInstance方法、静态的DeleteInstance方法。

根据instance创建的时间分为饿汉式和懒汉式两种实现方式。

饿汉式:the Singleton instance is EARLY createed at compile time。

懒汉式:the Singleton instance is LAZILY created at runtime。

先看代码,

1. 线程安全单例类的懒汉式实现

#include <mutex> //std::mutex

class Singleton_lazy
{
public:
    static Singleton_lazy *&GetInstance() ; //注意返回值类型,对一个指针变量的引用
    static void DeleteInstance();

private:
    Singleton_lazy() {}
    ~Singleton_lazy() {}
    Singleton_lazy(const Singleton_lazy &singleton) {}
    const Singleton_lazy operator=(const Singleton_lazy &singleton) {}

private:
    static Singleton_lazy *m_instance;
    static std::mutex m_mutex;
};

// 初始化静态成员变量
Singleton_lazy *Singleton_lazy::m_instance = NULL;
std::mutex      Singleton_lazy::m_mutex;

// 成员函数实现
Singleton_lazy *&Singleton_lazy::GetInstance()
{
    if (m_instance == NULL) //双重锁定,防止每次调用GetInstance都要加锁,只有发现需要实例化的时候才加锁
    {
        //如果两个线程同时通过了第一重的m_instance==NULL判断,就会有一个先加锁然后创建出来m_instance。
        //所以还需要第二重判断m_instance==NULL,防止被实例化出多个对象
        std::unique_lock<std::mutex> lock(m_mutex); //加锁
        if (m_instance == NULL)                     //
        {
            m_instance = new Singleton_lazy;
        }
    }
    return m_instance;
}

void Singleton_lazy::DeleteInstance()
{
    std::unique_lock<std::mutex> lock(m_mutex);
    if (m_instance)
    {
        delete m_instance;
        m_instance = NULL;
    }
}

注意:

  1. GetInstance方法的返回类型。对一个指针变量的引用,可行;指向引用的指针,不对。
  2. GetInstance方法的双重锁定。
  3. 在类的声明体外对static成员变量进行定义和初始化。(注意:对于一般的类,可以只在类体外对static成员定义,然后在构造函数中初始化。注意区分声明、定义和初始化的区别。声明 [声明语句为类体内的static std::mutex m_mutex] 不会给变量分配内存空间,定义 [定义语句为类体外的std::mutex Singleton_lazy::mutex; 对instance变量的定义和初始化在同一个语句中] 才会给变量分配内存空间。)

2.C++11线程安全单例类的懒汉式实现

class Single
{
public:
    // 获取单实例对象
    static Single &GetInstance()
    {
        // c++11内部静态变量具有线程安全性,所以可以利用这个特性很简单就实现一个线程安全的单例类
        // 局部静态特性的方式实现单实例
        static Single instance;
        return instance;
    }

private:
    Single();                                      // 禁止外部构造
    ~Single();                                     // 禁止外部析构
    Single(const Single &signal);                  // 禁止外部复制构造
    const Single &operator=(const Single &signal); // 禁止外部赋值操作
};

3.单例类的饿汉式实现(天生线程安全)

饿汉式利用语言运行时库的“静态初始化”特性,在单例类的实现代码一加载到程序中的时候,就在内存中实例化出了一个单例类的实例。

// 单例类饿汉式实现
// 本身具有线程安全性
#include <iostream>
using namespace std;

namespace myspace
{

class singleton_early
{
public:
    static singleton_early *GetInstance()
    {
        return g_psingle;
    }

    static void DeleteInstance()
    {
        if (g_psingle)
        {
            delete g_psingle;
            g_psingle = NULL;
        }
    }

    void test()
    {
        printf("test early singleton\n");
    }

private:
    singleton_early() {}
    ~singleton_early() {}
    singleton_early(const singleton_early &single) {}
    const singleton_early &operator=(const singleton_early &single) {}

private:
    static singleton_early *g_psingle;
};

// 静态成员变量的初始化
singleton_early *singleton_early::g_psingle = new singleton_early;
} // namespace myspace

 

从原理到落地:Java+TensorRT打造YOLO模型GPU极致推理方案 Java+TensorRT的YOLO模型GPU加速方案,核心是通过JNI桥接实现Java与TensorRT的高效交互,结合TensorRT的底层优化能力,最大化GPU算力。该方案既保留了Java后端的工程化优势(如易维护、生态完善),又解决了AI模型推理的性能瓶颈,可落地于实时视频分析、智能监控、工业质检等场景。基于TensorRT Dynamic Shape实现多尺寸输入的自适应优化;结合Java的协程(Virtual Thread)提升异步推理的并发效率; 阅读详情

相关推荐

详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2201_75437633的博客 1万+

深入探索单例之懒汉模式LazySingleTon

深入探索单例模式singleTon 单例模式:保证在任何类任何方法中,获取到某类实例只有一个 第一种方式 public class LazySingleTon { private LazySingleTon singleTon; //私有化构造方法 private LazySingleTon(){} //对外部提供一个方法,用于获取LazySingleTon实例 public synchronized LazySingleTon getInstance(){

qq_45748157的博客 487

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

懒汉式单例模式(延时加载)

单例模式(Singleton Pattern)是一种对象创建型模式。 单例模式:确保一个类仅有一个实例,且自行实例化,并对外提供这个唯一的实例。 单例模式实现方式分为非延时加载(饿汉式 Eager Singleton)和 延时加载(懒汉式 Lazy Singleton),延时加载( 节省内存)可以有效提高系统资源的利用效率,所以通常使用延时加载的懒汉式实现

想好了就去做吧 即便失败了 至少这条路上留下了你的脚印 992

USB 3.0 高清音视频采集芯片——MS2130

MS2130 是一款 USB 3.0 高清视频和音频采集芯片,内部集成 USB3.0 Device 控制器、数据收发模块、音视频处理模块。

YOU_SeMi的博客 7859

centos7 python3.12.1 报错 No module named _ssl,坑我几个小时

网上的教程很多,但几乎是无效的,跟着我这教程,可以完美解决。

Amio_的博客 1万+

单例模式之懒汉式

在上篇文章中,我们讲了单例模式中的饿汉式,今天接着来讲懒汉式。

ganmaotong的博客 3534

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 616

设计模式------单例模式(含代码)!!!!

一. 单例模式概述 单例模式(Singleton),也叫单子模式,是一种常用的设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候,整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,显然,这种方式简化了在...

司天宏的博客 736

optee系统启动流程

BL2 - Trusted Boot Firmware,一般为Trusted Bootloader, 也称第一个启动镜像。BL31 - EL3 Runtime Firmware,负责双系统切换,运行在secure monitor 或ATF中。BL33 - Non-Trusted Firmware,一般为uboot、linux kernel。BL32 - Secure-EL1 Payload, 一般为TEE OS Image。BL1 - Trusted ROM,一般为BootRom。

baron-周贺贺-代码改变世界ctw 279

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南

OpenClaw已经开源3个月有余,作为深耕AI Agent领域的博主,我亲身探索了各种基于OpenClaw的赚钱方法,也踩过坑、付出了时间与精力。现在,我将这些真金白银砸出来的实战经验,毫无保留地总结成这个专栏,分享给不想从零开始摸索的你。博主在优快云已有7万+粉丝和1100万+阅读量,但这却是我的第一个付费专栏。正因如此,我比任何人都更珍惜这个“第一次”。我会像一个手艺人打磨作品一样,死磕每一篇文章的质量,并持续根据订阅者的反馈优化内容。也许你的疑问就是当篇文章的优化点。

冯·诺依曼 2442

LazySingleton 单例模式

public class LazySingleton{ private static LazySingleton singleton; private LazySingleton(){ } //synchronized 同步 当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 public synchr...

disablebb的专栏 322

《大数据: Hive 交互命令和常用配置》

一、Hive 交互命令 1. 首先解决一个可能发生的问题 (log4 jar包冲突) 我这里解决方法就是删除一个,我删的是hive下的包 yexiang@hadoop1:<hive>$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/soft/apache-hive-2.3.7-bin/lib/log4j-slf4j-impl-2.6.2.ja.

yexiang优快云的专栏 288

设计模式:学习笔记(1)——单例模式

Java设计模式之单例模式 引入单例模式 什么是单例模式    对于某些类来说,我们只想其拥有一个实例,并且我们仅仅使用这一个实例:比如说线程池,缓存,对话框,处理偏好设置和注册表的对象、日志对象、显卡等设备的驱动程序的对象。这些类对象只能有一个,如果制造出多个实例,就会导致许多问题的产生。例如:程序的行为异常,资源使用过量或者冲突等等。 单例模式正是可以满足我们需求的设计原则:确保一

qo2yycc2的专栏 195

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

visio安装包

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

JAVA设计模式学习笔记(1)-单例模式 饿汉单例模式+懒汉单例模式

文章目录饿汉单例模式懒汉单例模式 单例模式如图: useClientSingleton 角色介绍: 1.Client—高层客户端 2.Singleton----单例类 实现单例模式主要有如下几个关键点: 构造函数不对外开放,一般为private 通过一个静态方法或枚举返回单例类对象 确保单例类的对象有且只有一个,尤其是在多线程的环境下 确保单例类对象在反序列化时不会重新构建对象 饿汉单例模式 ...

入佛门六根不净,入商场狼性不足 818

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java设计模式学习笔记1 单例模式

单例模式:指的是类 只能由自己生成唯一一个对象实例,并向其他对象提供这一实例。 实现单例模式有三种方法;常用的是所谓懒汉模式,与饿汉模式 1饿汉式:即在类在初始化的时候就已经自行实例化: public class Singleton(){ // 定义私有的构造方法,所以外界无法定义方法 private Singleton(){} // 自行实例化 private stat

Little__ZM 我愿意付出所有来换一个时光机 1034

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

设计模式学习笔记(1)——单例模式

文章目录为什么要用单例模式?写法 为什么要用单例模式? 1、单例模式节省公共资源 比如:大家都要喝水,但是没必要每人家里都打一口井是吧,通常的做法是整个村里打一个井就够了,大家都从这个井里面打水喝。 对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。 2、单例模式方便控制 就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都乱七八糟,如果想要控制日志的正确性,那么必须要对关键的代码进行上锁,只能一个一个按照顺序来写,而单例模式只有一个人来向日志里写入信息方便控制,避免了这种

BookSea的博客 1014

java设计模式学习笔记-1-单例模式

单例模式 饿汉式 class Singleton{ private Singleton(){} private final static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } } 饿汉式(静态代码块) class Singleton{ private Singleton(){} priv

weixin0605的博客 201

java 23 种设计模式学习笔记_1_单例模式

学习视频: 23种设计模式,终于有人用一个项目讲清楚了,保姆级教程通俗易懂定义类的构造方法为不让外界调用,通过这种方式来控制类的创建,从而实现只有一个类的实例。 代码如下: 但是这里有一个缺陷,类加载的时候就新建了一个实例,不管此时程序用没用到。当为时再初始化实例。 代码如下: 但是,这里带来了另外一个更严重的问题:线程不安全。 多个线程同时获取实例,有可能创建出多个实例出来。代码如下: 问题解决,但是还是有缺陷,每次获取实例的时候都会去获取锁,这个过程,减低了程序性能。只有为时,才需要加锁。 代码如下:

heye7949的博客 182

学习笔记——JAVA设计模式<1>单例模式

Group of four GFO23种设计模式 创建型模式建对象 单例模式 工厂模式 抽象工厂模式 建造者模式原型模式 结构性模式 适配器模式 桥接模式 装饰模式 组合模式 外观模式 享元模式 代理模式 行为模式 横版方法模式 命令模式 迭代器模式 观察者模式 中介者模式 备忘录模式 解释器模式 状态模式 策略模式 职责链模式 访问者模式 单例模式

thewaiting的博客 345

设计模式学习笔记1--单例模式

单例模式、多线程时的单例、静态初始化

暗月下捉迷藏 286

设计模式 学习笔记(1) 单例模式之饿汉式

单例模式 单例模式,就是指一个类有且仅有一个对象实例。 例如做一个学生成绩管理系统,我定义了一个“系统类”,用于存储数据,类似于“数据库”的功能。这个系统类当然只能有一个对象实例了;如果有多个实例,就会导致数据不同步。 1. 饿汉式 饿汉式,简单来讲,就是预先建立一个对象,设为 null ( Java中不可以这么写, C++中可以 ),不管什么时候需要用这个类,就返回这个唯一的对象引用或者...

Fluence_YHL 357

设计模式学习笔记(1)之单例模式

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 模型: 特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其它对象提供这一实例。 应用: 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。 一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方...

weixin_34244102的博客 78

java/android 设计模式学习笔记(1)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑。

Shawn_Dut的专栏 1万+

设计模式 学习笔记(1) 单例模式之懒汉式

  **懒汉式构造单例类** 懒汉式,指的就是需要时再构造(延迟构造),在效率上会优于饿汉式,因为饿汉式在进入 main 之前就要构造,懒汉式不用。 基本特点是:线程不安全 基本模板(加锁): #include &lt;bits/stdc++.h&gt; #define rep( i , j , n ) for ( int i = int(j) ; i &lt; int(n) ; +...

Fluence_YHL 237
上一篇: [C++]深度探索C++对象模型——关于默认构造函数
下一篇: C++ 智能指针
dummy_bot
博客等级 码龄10年 35粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值