剑指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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言中的system函数_c语言system的头文件

    c语言中的system函数_c语言system的头文件函数原型包含在头文件“stdlib.h”中intsystem(constchar*command)函数功能执行dos(windows系统)或shell(Linux/Unix系统)命令,参数字符串command为命令名。另,在windows系统下参数字符串不区分大小写。说明:在windows系统中,system函数直接在控制台调用一个command命令。在Linux…

    2022年9月18日
    3
  • vim编辑器显示行数过多_vim查看指定行

    vim编辑器显示行数过多_vim查看指定行设置ubuntu的vim编辑器显示行数,方法如下:1.打开终端输入:sudovi/etc/vim/vimrc,打开vim的配置文件(使用sudo可忽视vimrc文件的readonly属性);2.在配置文件中,找到最底行,点击键盘a键,打开输入模式;3.输入:setnu,设置显示行数;4.点击键盘esc键,退出输入模式,点击shift+:,输入:wq,保存退出;至此所有用vim打开的…

    2025年7月21日
    4
  • 利用树莓派搭建 web 服务器 (个人认为是网上步骤最全,也是最新的方式了 使用 PHP7)[通俗易懂]

    利用树莓派搭建 web 服务器 (个人认为是网上步骤最全,也是最新的方式了 使用 PHP7)[通俗易懂]#前言在暑假的时候想玩玩树莓派,就买了一块树莓派3B+,结果买回来也没太玩就放在宿舍吃灰,最近突然对网站很感兴趣,于是就在网上查找资料去搭建了这个web服务器,它是使用的nginx+PHP7+typecho组成的服务器。#首先安装raspbian系统引用了树莓派实验室的下载地址,大家可以直接下载。下载链接:http://downloads.raspberrypi.org/raspbian_…

    2022年6月6日
    32
  • ubuntu pip清华源_ubuntu 清华源

    ubuntu pip清华源_ubuntu 清华源pip清华镜像源使用方法总结2020年07月07日|萬仟网网络运营|我要评论临时使用pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplesome-package注意,simple不能少,是https而不是http设为默认修改~/.config/pip/pip.conf(Linux)%…

    2025年5月23日
    5
  • MySQL的JDBC连接

    MySQL的JDBC连接MySQL的JDBC连接MySQL的JDBC概念MySQL的JDBCJDBC添加数据封装连接工具更新数据和事务删除数据查询数据MySQL的JDBC概念JDBC是JavaDatabaseConnective的缩写,表示使用Java去连接数据库进行数据操作的过程MySQL的JDBC创建动态项目-以eclipse为例,首先要创建动态项目连接开发包(在www.mvnrepositor…

    2022年7月17日
    13
  • 安装SQL Server2008的示例数据库AdventureWorks 2008「建议收藏」

    安装SQL Server2008的示例数据库AdventureWorks 2008「建议收藏」在安装SQLServer2008时,默认是不安装示例数据库的,如果要用到的话,就得自行下载相应的数据库,然后安装,当然,安装也还是要有一定的方法的,不然装不上。1、检查安装环境,下载安装包首先,检查你电脑的环境,是否有安装SQLServer2008,并且打了SQL2008SP1补丁。然后去官网下载AdventureWorks2008示例数据库安装包。下载地址是:http://msft

    2025年9月7日
    5

发表回复

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

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