单例模式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机制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ClientScript.RegisterStartupScript()「建议收藏」

    ClientScript.RegisterStartupScript()「建议收藏」一些客户端脚本usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.HtmlControls;usingSystem.Web.UI.WebControls…

    2022年7月20日
    12
  • web安全概述_网络安全和web安全

    web安全概述_网络安全和web安全域名什么是域名?域名(DomainName),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。例:www.baidu.comDNS什么是DNS?域名系统(DomainNameSystem,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过2

    2022年9月20日
    0
  • WannaCry勒索病毒_永恒之蓝病毒攻击原理

    WannaCry勒索病毒_永恒之蓝病毒攻击原理WannaCry永恒之蓝的电脑勒索病毒正在全球蔓延,在电脑感染病毒后,电脑里的所有数据都会被加密,用户完全打不开,接着屏幕会弹出消息框,要求受害人支付比特币赎金,勒索病毒一旦中招危害巨大,本文总结出勒索病毒最全防范措施。

    2022年9月25日
    0
  • html5开发手机端网页(移动端web开发的几种方式)

    最近一直在研究移动手机网站的开发,发现做手机网站没有想象中的那么难。为什么会这么说呢?我们试想下:我们连传统的PC网站都会做,难道连一个小小的手机网站难道都搞不定吗?其实手机网站就是一个微缩版的PC网站罢了!至于为什么觉得难、觉得无从下手。段亮觉得有以下几点:一、没有完整的思路和流程就像做网站的流程一样,如果你能知道它的流程,我相信就不会觉得做手机网站难!真正难的是你没有思

    2022年4月18日
    48
  • 「运维有小邓」给企业文件服务器加把锁(文件服务器审计)

    「运维有小邓」给企业文件服务器加把锁(文件服务器审计)DataSecurityPlus是一款由卓豪ManagerEngine推出的企业文件服务器审计工具,它不仅能对文件服务器内的内容进行审计,还可以对用户的访问行为进行审计,包括:“谁”在“什么时间”访问(修改)了“哪些”文件。

    2022年6月3日
    26
  • 武道释义 &#183; 零散

    武道释义 &#183; 零散

    2022年1月29日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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