设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)

单例模式

单例模式的概念

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
GoF 对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
在这里插入图片描述

为什么适用单例模式

在应用系统开发中,我们常常有以下需求:

  1. 在多个线程之间,比如初始化一次 socket 资源;比如 servlet 环境,共享同一个资源或者 操作同一个对象
  2. 在整个程序空间使用全局变量,共享资源
  3. 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

实现单例步骤常用步骤

  1. 构造函数私有化
  2. 提供一个全局的静态方法(全局访问点)
  3. 在类中定义一个静态指针,指向本类的变量的静态变量指针

懒汉式实现

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好

//懒汉式,需要才创建
class Singleton_lazy{
private:Singleton_lazy(){}//防拷贝Singleton_lazy(Singleton const&);Singleton_lazy & operator=(Singleton const&);
public:static Singleton_lazy *getInstace()	//提供方法获取{if(nullptr == pSingleton) //其它线程看到指针不为空,说明已创建,直接用,不需要再等待{m_mtx.lock(); //加锁保证线程安全if (pSingleton == NULL){pSingleton = new Singleton_lazy;//new有可能失败,抛出异常造成死锁}m_mtx.unlock();return pSingleton;}}//内嵌垃圾回收类 RAII的思想class Garbo{~Garbo(){if (pSingleton != NULL){delete pSingleton;}}};
private:static Singleton_lazy * pSingleton;//类外初始化好static mutex m_mtx; //互斥锁
};
//类外初始化
volatile Singleton_lazy * Singleton_lazy::pSingleton = NULL;
Singleton_lazy ::CGarbo Garbo;
mutex Singleton::m_mtx;

编译器有可能进行优化:指令的重排
可以加上volatile

本来的顺序
  1. 申请空间
  2. 构造对象
  3. 赋值
优化的顺序
  1. 申请空间
  2. 赋值
  3. 构造对象

饿汉式实现

就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。

 //饿汉式,比较着急class Singleton_hungry{private:Singleton_hungry(){}//防止拷贝Singleton_hungry(Singleton const&);Singleton_hungry& operator=(Singleton const&);public:static Singleton_hungry *getInstace(){return 	pSingleton;}//实现内嵌垃圾回收类#if 0class Garbo{~Garbo(){if (pSingleton != NULL){delete pSingleton;}}};#endifprivate:static Singleton_hungry * pSingleton;};Singleton_hungry * Singleton_hungry::pSingleton = new Singleton_hungry;

线程安全

  1. 饿汉式是线程安全的,在main函数前创建对象
  2. 懒汉式不是线程安全的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言解析http请求表单内容

[1].[文件] cgi.h ~ 405B 下载(105) 跳至 [1] [2] [3] [4] [5] [6] [7] [8] ?123456789101112131415161718192021222324252627#ifndef CGI_H#define CGI_H#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct Node{char *…

centos给用户添加sudo权限

linux给用户添加sudo权限&#xff1a; 有时候&#xff0c;linux下面运行sudo命令&#xff0c;会提示类似&#xff1a; xxxis not in the sudoers file. This incident will be reported. 这里&#xff0c;xxx是用户名称&#xff0c;然后导致无法执行sudo命令&#xff0c;这时候…

php手册

http://www.php100.com/manual/php/ http://www.kuqin.com/php5_doc/

套接字编程---2(TCP套接字编程的流程,TCP套接字编程中的接口函数,TCP套接字的实现,TCP套接字出现的问题,TCP套接字多进程版本,TCP套接字多线程版本)

TCP模型创建流程图 TCP套接字编程中的接口 socket 函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&…

安全关注

http://yttitan.blog.51cto.com/70821/1576365

Linux中netstat工具详解

简介 Netstat 命令用于显示各种网络相关信息&#xff0c;如网络连接&#xff0c;路由表&#xff0c;接口状态 (Interface Statistics)&#xff0c;masquerade 连接&#xff0c;多播成员 (Multicast Memberships) 等等。 常见参数 -a (all)显示所有选项&#xff0c;默认不显示…

网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)

应用层 应用层 负责应用程序之间的数据沟通-----协议都是用户自己定的 自定制协议&#xff1a; 结构化数据传输 序列化&#xff1a; 将数据对象以指定的协议&#xff08;数据格式&#xff09;进行可用于持久化存储或者数据传输时的数据组织 例如在分布式的系统中&#xf…

正则表达式 学习

http://regexr.com/ 在线匹配 http://c.biancheng.net/cpp/html/1434.html 查询网址

网络基础2-2(传输层,端口,详谈UDP)

传输层 负责数据能够从发送端传输接收端. 端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序;在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n查看);一个端口只能被一个…

中文rfc文档路径

http://man.chinaunix.net/develop/rfc/default.htm

网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

TCP协议 TCP协议概念 TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议格式 1. 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去; 2. 32位序号/32位确认号: 后面详细讲; 3. 4位TCP报头长度: 表示该…

超时设置

//read操作加上超时时间。1 int read_timeout(int fd, void *buf, uint32_t count, int time)2 {3 if(time > 0) {4 fd_set rSet;5 FD_ZERO(&rSet);6 FD_SET(fd, &rSet);7 8 struct timeval timeout;9 memset(&tim…

字符串题目 1 --------判断两个字符串是否为旋转词

题目描述 如果一个字符串为str&#xff0c;把字符串的前面任意部分挪到后面形成的字符串交str的旋转词。比如str“12345”&#xff0c;str的旋转串有“12345”、“45123”等等。给定两个字符串&#xff0c;判断是否为旋转词。 输入描述: 输出包含三行&#xff0c;第一个两个…

2021-03-04

为什么nginx转发后端默认使用1.0而不是1.1 在 Nginx 的官网文档中&#xff0c;有这样一个指令&#xff1a; Syntax: gzip_http_version 1.0 | 1.1; Default: gzip_http_version 1.1; Context: http, server, location Sets the minimum HTTP version of a request required to…

字符串题目---2判断两个字符串是否为变形词

题目描述 给定两个字符串str1和str2&#xff0c;如果str1和str2中出现的字符种类出现的一样且每种字符出现的次数也一样&#xff0c;那么str1和str2互为变形词。请判断str1和str2是否为变形词 输入描述: 输入包括3行&#xff0c;第一行包含两个整数n&#xff0c;m(1 \leq n,…

设计模式7----代理模式

代理模式 概念 Proxy 模式又叫做代理模式&#xff0c;是结构型的设计模式之一&#xff0c;它可以为其他对象提供一 种代理&#xff08;Proxy&#xff09;以控制对这个对象的访问。 所谓代理&#xff0c;是指具有与代理元&#xff08;被代理的对象&#xff09;具有相同的接口的…

网络基础3-1(细谈IP协议头, 网络层,子网划分,路由选择,数据链路层,以太网帧格式,MAC地址,再谈ARP协议)

IP协议 IP协议头格式 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是44位头部长度(header length): IP头部的长度是多少个。32bit, 也就是 length * 4 的字节数. 4bit表示大 的数字是15, 因此IP头部大长度是60字节8位服务类型(Type Of Service): 3位优先权字段(已…

c++常见并且必须记住的问题

一、基础知识 基本语言 1、说一下static关键字的作用 ​2、说一下C和C的区别 3、说一说c中四种cast转换 4、请说一下C/C 中指针和引用的区别&#xff1f; 5、给定三角形ABC和一点P(x,y,z)&#xff0c;判断点P是否在ABC内&#xff0c;给出思路并手写代码 6、怎么判断一个…

网络中典型协议--(DNS,输入url后, 发生的事情. ,ICMP,NAT)

DNS&#xff08;Domain Name System&#xff09; DNS是一整套从域名映射到IP的系统 域名服务器发展背景 TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆. 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机…

高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)

高级IO&#xff1a; 五种典型IO&#xff1a; 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型&#xff1a;select/poll/epoll 五种典型IO 阻塞IO IO操作的流程&#xff1a;等待IO操作条件具备&#xff0c;然后进行数据拷贝 为了完成IO操作发起调用&#xff…