单例模式singleton_单例模式例子

单例模式singleton_单例模式例子单例模式 Singleton动机模式定义实例结构要点总结笔记动机在软件系统中,经常有一些特殊的类,必须保证它们在系统中只存在一个实例,才能保证他们的逻辑正确性、以及良好的效率如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?模式定义保证一个类仅有一个实例,并提供一个该实例的全局访问点。实例单例class Singleton{private : Singleton(); Singleton(const Singleton& other);public:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件系统中,经常有一些特殊的类,必须保证它们在系统中只存在一个实例,才能保证他们的逻辑正确性、以及良好的效率

如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

模式定义

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

实例

单例

class Singleton{ 
   
private :
    Singleton();
    Singleton(const Singleton& other);
public:
    static Singleton* getInstacne();
    static Singleton* m_instance;
}
Singleton* Singleton::m_instance = nullptr;

//线程非安全
Singleton* Singleton::getInstacne(){ 
   
    if(m_instance == nullptr){ 
   
        m_instance = new Singleton();
    }
    return m_instance;
}

//线程安全
Singleton Singleton::getInstance(){ 
   
    Lock lock;
    if(m_instance == nullptr){ 
   
        m_instance = new Singleton();
    }
    return m_instance;
}

//双检测锁,但由于内存读写recorder不安全
Singleton* Singleton::getInstacne(){ 
   
    if(m_instance == nullptr){ 
   
        Lock lock;
        if(m_instance == nullptr){ 
   
            m_instance = new Singleton();
        }
    }
    return m_instance;
}

 
//C++11版本之后的跨平台实现(voliate)
std::atomic<Singleton*>Singleton::m_instance;
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance(){ 
   
    Singleton* tmp = m_instance.load(std::memory_order_relaxed);
    std::atomic_thread_fence(std::memory_order_acquire);//获取内存fence
    if(tmp == nullptr){ 
   
        std::lock_guard<std::mutex> lock(m_mutex);
        tmp = m_instance.load(std::memory_order_relaxed);
        if(tmp == nullptr){ 
   
            tmp = new Singleton();
            std::atomic_thread_fence(std::memory_order_release);//释放内存fence
            m_instance.store(tmp,std::memory_order_relaxed);
        }
    }
    return tmp;
}

结构

在这里插入图片描述

要点总结

  • Singleton 模式中的实例构造器可以设置为protected以允许子类派生。
  • Singleton 模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷相违背
  • 如何实现多线程环境下安全的Singleton?注意对双检查锁的正确实现

笔记

  • 保证只有一个单例是设计者的责任 不是使用者的责任
  • java C#都有voliate机制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168507.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux ettercap,CentOS下安装ettercap

    linux ettercap,CentOS下安装ettercapCentOS下安装ettercapettercap下载地址http://ettercap.sourceforge.net/download.php下载好之后解压出来,进入到解压目录#tarzxvfettercap-NG-0.7.3.tar.gz#cdettercap-NG-0.7.3阅读README#vimREADMEMANDATORY://安装必须依赖的libpcap>=…

  • 墙壁rj45插线顺序_网线插座接法详细图解

    墙壁rj45插线顺序_网线插座接法详细图解  RJ45接口默认有2种线序,分别如下:普通线序12345678A序白-绿绿白-橙蓝白-蓝橙白-棕棕B序白-橙橙白-绿蓝白-蓝绿白-棕棕  一般,采用B序来设置RJ45插座,即白橙橙,白绿蓝,白蓝绿,白棕棕,线序为123454678。图(1)RJ45网线的A序、B序  有些网口插座内置了桥接模块,线与线之间有对调,它不是按照从小到大排序,而是打乱的一种线序。1、CAT5ET568A/B  

  • C#学生成绩管理系统「建议收藏」

    C#学生成绩管理系统「建议收藏」##课设不用愁C#学生成绩管理系统>学生选课及成绩查询系统是一个学校不可缺少的部分,传统的人工管理档案的方式存在着很多的缺点,如:效率低、保密性差等,所以开发一套综合教务系统管理软件很有必要

  • C++路标设置「建议收藏」

    C++路标设置「建议收藏」B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的“空旷指数”。现在政府决定在公路上增设一些路标,使得公路的“空旷指数”最小。他们请求你设计一个程序计算能达到的最小值是多少。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。输入格式:第1行包括三个数l(0<l≤1000,000,00

  • IPv6/IPv4 + aliddns 实现黑群晖外网控制和访问

    IPv6/IPv4 + aliddns 实现黑群晖外网控制和访问前言一直想弄台黑群NAS,但因为穷!一直没入,一直用的是玩客云,但玩客云满足不了我的需求,但正好搭上蜗牛星际的车!J1900+4G内存+16G固态+4盘位+千兆网口才380元,性价比是真的高,再买两个二手的2T机械硬盘(一个做备份盘),还有一个自己的500G机械硬盘,目前完全够用。目前主流内网穿透方案目前内网穿透有如下几种方案frp、ngrok等转发工具,需要一个有公网ip的服务器,…

  • python和pycharm以及anaconda的安装顺序_症证病三者之间区别

    python和pycharm以及anaconda的安装顺序_症证病三者之间区别1、致欢迎词我将详细讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上。而我自己作为小白,很不幸的没有错过任何的坑,都跳了进去,所以在这里写下经验贴,一方面希望能给后来的学者能够高效的避开这些坑,另一方面也算是自己的总结与警告。2、内容大纲2.1安装顺序能够使用Python的安装…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号