教科书里的单例模式

  我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。

  上代码:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class singleton
{
protected:
    singleton(){}
private:
    static singleton* p;
public:
    static singleton* instance();
};
singleton* singleton::p = NULL;
singleton* singleton::instance()
{
    if (p == NULL)
        p = new singleton();
    return p;
}

懒汉与饿汉

  单例大约有两种实现方法:懒汉与饿汉。

  • 懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;
  • 饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。

  特点与选择:

  • 由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
  • 在访问量较小时,采用懒汉实现。这是以时间换空间。

3 线程安全的懒汉实现

  线程不安全,怎么办呢?最直观的方法:加锁。

#include<iostream>
using namespace std;

class single
{
protected:
single()
{}
private:
static single *s;
public:
static single* instant(); 
};
single* single::s=NULL;
single* single::instant()
{
if(s==NULL)
{
s=new single();
}
return s;
}

//懒汉加锁s实现
class single
{
protected:
single()
{
pthread_mutex_initI(&mutex);
}
private:
static single *s;
static pthread_mutex_t mutex;
public:
static single* instant(); 
};
pthread_mutex_t single::mutex;
single* single::s=NULL;
single* single::instant()
{
if(p==NULL)
{
pthread_mutex_lock(&mutex);
if(s==NULL)
{
s=new single();
}
pthread_mutex_unlock(&mutex);
}
return s;
}
//n内部静态变量的懒汉实现
class single
{
protected:
single()
{
pthread_mutex_init(&mutex);
}
private:
static int a;
static pthread_mutex_t mutex;
static single* instant(); 
};
pthread_mutex_t single::mutex;
single* single::instant()
{
pthread_mutex_lock(&mutex);
static single obj;
pthread_mutex_unlock(&mutex);
return &obj;
}
//e饿汉实现-》线程安全
class single
{
protected:
single()
{}
private:
static single *s;
public:
static single* instant(); 
};
single* single::s=new single();
single* single::instant()
{
return s;
}

c++实现单例类(懒汉与饿汉)相关推荐

  1. JAVA_Lesson8(传智播客笔记之继承、单例设计模式懒汉式、饿汉式)

    数组对象工具的建立(重要的是这种思想) 主函数是静态的,主函数需要调用的也需要static. 当有2个.java文件时,先编译含有函数功能的.java文件,再编译含主函数的.java文件.(因为主函数 ...

  2. 如何编写单例模型?(饿汉和饱汉模式)

    package cn.kgc.tools;import java.io.IOException; import java.io.InputStream; import java.util.Proper ...

  3. java 单例类_Java单例类

    单例类: 主要知识点: 1,单例类概念.特点 2,三种单例类懒汉,饿汉,双重加锁举例, 3,懒汉.饿汉区别以及单例类的总结: 1,概念:java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单 ...

  4. java单例设计模式懒汉_Java设计模式之单例设计模式(懒汉、饿汉)

    [toc] Java设计模式之单例设计模式(懒汉.饿汉) 相信面试过的初中级Java开发的朋友可能都有遇到过单例设计模式的笔试题吧,如果之前没有背下来或者不理解,可以看看下面这篇文章,应该足够应付笔试 ...

  5. 饿汉单例、懒汉单例类

    一.单例模式 可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象. 例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间. 二.饿汉单例类 1.饿汉单例 ...

  6. 单例模式懒汉、饿汉和登记

    转载自  JAVA设计模式之单例模式 本文继续介绍23种设计模式系列之单例模式. 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记 ...

  7. 游戏设计模式——C++单例类

    前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...

  8. java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  9. java 防止反射_如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

最新文章

  1. 模拟滤波器和数字滤波器
  2. mySQL数据库中的备份代码_MySQL中的备份数据库
  3. RocketMq 事务消息使用
  4. 可变化的鸿蒙武器,DNF2018史诗改版大全 武器套装改版属性介绍
  5. python机器学习案例系列教程——GBDT算法、XGBOOST算法
  6. 20191117每日一句 EVERYBODY DIES, BUT NOT EVERYBODY LIVES
  7. 机器学习深度学习视频资料大汇总
  8. arm-linux-gnueabihf-gcc下载
  9. 微信小程序通过点击事件传参(data-)
  10. 转载:技术大停滞——范式春梦中的地球工业文明8 反思与总结
  11. 动态iptables 防火墙
  12. STM32f103系列和f107系列移植
  13. iPhoneX设计稿适配Android,三分钟弄懂iPhoneX设计尺寸和适配(二)
  14. 台式计算机摄像头怎么打开,如何打开摄像头,教您Win7摄像头怎么打开
  15. c语言函数变量的作用域与生存期
  16. element el-table 计算指定列
  17. 使用nvm安装node报错,Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt. Get “https://nodej
  18. Linux之宝塔面板安装和使用
  19. Ubuntu SDK 安装
  20. [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市

热门文章

  1. 4.19. 在线用户表
  2. 存储变革 IBM V5000四大优势助用户破旧立新
  3. 远程桌面退出全屏/不能全屏/全屏切换的技巧
  4. Lua-简洁、轻量、可扩展的脚本语言
  5. Python高级运维开发2016年7月第14期隆重开课
  6. 【2D动画】《想你》。。。。难以想象
  7. 传对象与传串_简单介绍
  8. CodeForces - 1350C Orac and LCM(数论)
  9. DCN RepPoints解读
  10. Three.js入门