剑指Offer面试题:1.实现单例模式建议收藏

一题目:实现单例模式Singleton只能生成一个实例的类是实现了Singleton(单例)模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:实现单例模式Singleton

题目:设计一个类,我们只能生产该类的一个实例。

  只能生成一个实例的类是实现了Singleton(单例)模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。在常用的模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式。因此,写一个Singleton的类型是一个很常见的面试题

二:单例模式的几种实现方法

(1)单线程单例模式

// 单例模式
class Singleton
{
private:
    Singleton(){}
    ~Singleton(){delete m_pSingleton;};

public:
    static Singleton* Instance();

private:
    static Singleton*m_pSingleton;
};

Singleton* Singleton::m_pSingleton = NULL;
Singleton* Singleton::Instance()
{
    if (!m_pSingleton)
    {
        m_pSingleton = new Singleton();
    }

    return m_pSingleton;
}

  这是一个很棒的实现,简单易懂。但这是一个完美的实现吗?不!该方法是线程不安全的,考虑两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给p,这是严重的错误!同时,这也不是单例的唯一实现!

(2)懒汉单例模式

  a. 使用互斥对象实现懒汉模式

// 单例模式
class Singleton
{
private:
    Singleton(){};
    ~Singleton(){
        delete m_pSingleton;
        DeleteCriticalSection(&cs);}

public:
    static Singleton * Instance();

private:
    static Singleton *m_pSingleton;
    static CRITICAL_SECTION cs;
    static bool bInitCriticalSection;
};

CRITICAL_SECTION Singleton::cs = {0};
bool Singleton::bInitCriticalSection = false;
Singleton * Singleton::m_pSingleton = NULL;

Singleton * Singleton::Instance()
{
    if (!bInitCriticalSection)
    {
        InitializeCriticalSection(&cs);
        bInitCriticalSection = true;
    }
    if (!m_pSingleton)
    {
        EnterCriticalSection(&cs);
        m_pSingleton = new Singleton();
        LeaveCriticalSection(&cs);
    }

    return m_pSingleton;
}

  b. 使用内部静态变量实现懒汉模式

   此方法也很容易实现,在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针就可以了。推荐这种实现方法,真得非常简单

// 单例模式
class Singleton
{
private:
    Singleton(){}
    ~Singleton(){DeleteCriticalSection(&cs);}

public:
    static Singleton * Instance();

private:
    static CRITICAL_SECTION cs;
    static bool bInitCriticalSection;
};

CRITICAL_SECTION Singleton::cs = {0};
bool Singleton::bInitCriticalSection = false;
Singleton * Singleton::Instance()
{
    if (!bInitCriticalSection)
    {
        InitializeCriticalSection(&cs);
        bInitCriticalSection = false;
    }
    EnterCriticalSection(&cs);
    static Singleton m_Singleton;
    LeaveCriticalSection(&cs);

    return &m_Singleton;
}

(3)饿汉单例模式

  饿汉实现本来就是线程安全的,不用加锁。为啥?自己想!

// 单例模式
class Singleton
{
private:
    Singleton(){};
    ~Singleton(){}

public:
    static Singleton * Instance();

private:
    static Singleton *m_pSingleton;
};

Singleton * Singleton::m_pSingleton = new Singleton();
Singleton * Singleton::Instance()
{
    return m_pSingleton;
}

 

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

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

(0)
上一篇 2021年12月19日 上午11:00
下一篇 2021年12月19日 下午12:00


相关推荐

  • tomcat java_maven和java有什么区别

    tomcat java_maven和java有什么区别缓存什么是缓存[Cache]存在内存中的临时数据将用户经常查询的数据放在缓存(内存)中,用户去查询数据的时候就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。为什么使用缓存减少和数据库的数据交换次数,较少系统开销,提高系统效率什么样的数据库能使用缓存经常查询并且不经常改变的数据Mybatis缓存MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。默认情况下,只启用了本地的会话缓存,它仅

    2022年8月9日
    6
  • python decode函数的用法_decode函数的用法

    python decode函数的用法_decode函数的用法DECODE函数是ORACLEPL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。DECODE有什么用途呢?先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%,通常的做法是,先选出记录中的工资字段值?selectsalaryintovar-salar…

    2022年7月25日
    10
  • mac Python安装pybloomfilter 出现找不到libcrypto的问题

    mac Python安装pybloomfilter 出现找不到libcrypto的问题获取新的库brewupdate&&brewupgrade&&brewinstallopensslcd/usr/local/Cellar/openssl/1.0.2t/libsudocplibssl.1.0.0.dyliblibcrypto.1.0.0.dylib/usr/local/lib/建立新的连接sudoln-sli…

    2022年6月28日
    38
  • SQL注入攻击原理以及基本方法

    SQL注入攻击原理以及基本方法一 SQL 注入的概述定义 SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断 攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句 以此来实现欺骗数据库服务器执行非授权的任意查询 从而进一步得到相应的数据信息 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 为了更直观的让大家了解到 sql 注入的原理 贴上一张 sql 注入攻击示意图

    2026年3月26日
    3
  • case when 判断_sqlservercase用法

    case when 判断_sqlservercase用法casewhen简单用法—改变结果SELECTCASE id WHEN21THEN ‘aaaaa’ WHEN22THEN ‘bbbbb’ELSE’其他’ END FROM hrmresource WHERE id=23casewhen复杂用法—执行不同的sqlSELECT ( CASE WHENa.id=21THEN (SELECTidFROMhrmresourceWHEREidIN(21

    2025年9月16日
    8
  • 在IDEA上Git的入门使用(IDEA+Git)[通俗易懂]

    在IDEA上Git的入门使用(IDEA+Git)[通俗易懂]前言:Git是目前最常用的版本控制系统,而IDEA又是目前日渐流行的ide,因此现在来介绍在IDEA上Git的入门使用。 准备:Git、IDEA、GitHub账号开始之前先创建一个简单的测试项目 将代码交由Git管理    VCS ——> EnableVersionControlIntegration…    ——> 选择要使…

    2022年6月16日
    47

发表回复

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

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