面试题目整理 线程安全的单例模式

Swift 面试题及答案整理,最新面试题 在Swift中,类的继承关系和协议的实现提供了运行时多态性,使得同一接口可以有多个实现,具体使用哪个实现在运行时通过动态派发来决定。这些函数接受一或多个函数作为输入,并返回一个新的集合,使得你可以用更少、更清晰的代码来执行复杂的操作。通过使用协议,你可以定义一组应该由特定类型实现的相关方法和属性,从而实现接口的抽象和多态性。来调用抛出错误的函数,分别表示:检查错误并使用do-catch处理、将结果转换为可选值(如果发生错误则结果为nil)、断言调用不会抛出错误(如果实际抛出错误,则会触发运行时错误)。 阅读详情

首先看看boost 的单例模式 

@ boost/thread/detail/singleton.hpp

template <class T>
class singleton : private T
{
private:
    singleton();
    ~singleton();


public:
    static T &instance();
};
template <class T>
inline singleton<T>::singleton()
{
    /* no-op */
}
template <class T>
inline singleton<T>::~singleton()
{
    /* no-op */
}
template <class T>
/*static*/ T &singleton<T>::instance()
{
    // function-local static to force this to work correctly at static
    // initialization time.
    static singleton<T> s_oT;
    return(s_oT);
}
单例在首次调用访问时产生 非线程安全

@ boost/container/detail/singleton.hpp

// T must be: no-throw default constructible and no-throw destructible
template <typename T>
struct singleton_default
{
  private:
    struct object_creator
    {
      // This constructor does nothing more than ensure that instance()
      //  is called before main() begins, thus creating the static
      //  T object before multithreading race issues can come up.
      object_creator() { singleton_default<T>::instance(); }
      inline void do_nothing() const { }
    };
    static object_creator create_object;


    singleton_default();


  public:
    typedef T object_type;


    // If, at any point (in user code), singleton_default<T>::instance()
    //  is called, then the following function is instantiated.
    static object_type & instance()
    {
      // This is the object that we return a reference to.
      // It is guaranteed to be created before main() begins because of
      //  the next line.
      static object_type obj;


      // The following line does nothing else than force the instantiation
      //  of singleton_default<T>::create_object, whose constructor is
      //  called before main() begins.

      create_object.do_nothing();


      return obj;
    }
};
template <typename T>
typename singleton_default<T>::object_creator
singleton_default<T>::create_object;

重要的是这句:

      // The following line does nothing else than force the instantiation
      //  of singleton_default<T>::create_object, whose constructor is
      //  called before main() begins.

保证单例在main() 之前生成

类似的设计在boost还有,

再来一个陈硕的 singleton 

template<typename T>
class Singleton : boost::noncopyable
{
 public:
  static T& instance()
  {
    pthread_once(&ponce_, &Singleton::init);
    assert(value_ != NULL);
    return *value_;
  }


 private:
  Singleton();
  ~Singleton();


  static void init()
  {
    value_ = new T();
    if (!detail::has_no_destroy<T>::value)
    {
      ::atexit(destroy);
    }
  }


  static void destroy()
  {
    typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
    T_must_be_complete_type dummy; (void) dummy;


    delete value_;
    value_ = NULL;
  }


 private:
  static pthread_once_t ponce_;
  static T*             value_;
};


template<typename T>
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;


template<typename T>
T* Singleton<T>::value_ = NULL;

使用pthread_once 保证init 只执行一次


c++ 11 的 call_once 

template< class Function, class... Args >  
void call_once ( std::once_flag& flag, Function&& f, Args&& args... );  
参数解析Parameters:  
flag     -   an object, for which exactly one function gets executed  
f     -   需要被调用的函数  
args...  -   传递给函数f的参数(可以多个)  
返回值为 (none)  
抛出异常  
std::system_error if any condition prevents calls to call_once from executing as specified any exception thrown by f

使用 所以我们能使用 call_once 函数实现一个 跨平台的singleton

首先拷贝 boost nocopyable

class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private:  // emphasize the following members are private 
noncopyable(const noncopyable&);
const noncopyable& operator=(const noncopyable&);
};
template<typename T>
class Singleton : public noncopyable
{
public:
static T& instance()
{
call_once(ponce_, &Singleton::init);
return *value_;
}
private:
static void init()
{
value_ = new T();
}
private:
static std::once_flag ponce_;
static T*             value_;
};
template<typename T>
std::once_flag Singleton<T>::ponce_ ;
template<typename T>
T* Singleton<T>::value_ = nullptr;


Android设计模式系列-单例模式 这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。 阅读详情

相关推荐

【科研】Michaelis–Menten 曲线(米氏曲线)中反应速率的计算

Michaelis–Menten 曲线 米氏曲线 纵坐标 反应速率求值 朗伯比尔定律

weixin_42809675的博客 2万+

设计模式-单实例-C++Singleton类模板实现及使用

C++单实例类模板实现及使用 单实例类注意事项: 1. 构造私有化,拷贝构造函数及重载=操作符也私有化,暴露新的访问接口; 2. 推荐使用懒汉式即 getInstance()接口且使用双重锁定,既解决多线程安全问题又保证性能,同时还要防止某一用户delete获取到的实例导致其他用户无法正常使用; 3. 考虑资源回收,使用内部类Garbo及其静态对象,系统自动析构全局变量及静态成员变量时可以实现自动删除单实例对象;一般单实例对象会一直伴随系统存在,不设计回收问题不大; 4. 静态成员变量要类外初始化,其中

halazi100 826

基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战解析

本文详细解析了基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战方案。从环境搭建、驱动安装、双雷达配置、外参标定、时间同步到点云融合核心实现,全面介绍了技术要点与避坑指南,并提供了工程化部署与性能优化建议,助力开发者高效实现高精度点云合成应用。

ss78901的博客 1093

C++之不完全类型

在muduo源代码中,会看到这样的代码: typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1]; T_must_be_complete_type dummy; (void) dummy;    在C++中,类型有Complete type和Incomplete type之分,对于Complete type, 它的大小在编译

q5707802的专栏 667

AD9371实战:如何用ZCU106搭建JESD204B TX时钟链(含关键参数计算)

本文详细解析了如何基于Xilinx ZCU106开发板为AD9371搭建JESD204B TX时钟链。文章从系统需求出发,逐步推导出从IQ采样率到GTH线速率的关键参数计算公式,并提供了在Vivado中配置GTH收发器(包括QPLL选择、分频比设置)的实战步骤与调试技巧,旨在帮助硬件工程师快速实现稳定可靠的JESD204B高速数据传输链路。

weixin_29164843的博客 293

车载以太网-ARP 动态 静态

车载以太网-ARP 动态 静态

天赐好车的博客 410

pthread_key_t和pthread_key_create()详解

文章来源自pthread_key_t和pthread_key_create()详解 下面说一下线程中特有的线程存储, Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个

ZWFGOGO的专栏 1172

微信小程序流量主提升ecpm的一些方法

ecpm就是千次广告曝光收入,是一个预估的价格,而不是额定的,他是随着曝光度,用户点击度,页面访问数来决定的。

任聪聪的博客 1万+

单例模式 OP

#ifndef OURAPI_SINGLETON_H #define OURAPI_SINGLETON_H #include #include // atexit template class CAFSingleton {  public:   static T& instance()   {     pthread_once(&ponce_, &CAFSingleto

lfxyan的专栏 756

RK3588 Buildroot 新建板级DTS

在rk3588 linux开发过程中,新创建板型主要基于硬件差异化、软件适配与优化、项目定制化等多方面需求。

501846585_QQAndroid_java 1299

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

《Linux多线程服务端编程-使用muduo C++网络库》学习笔记——第二章

本文目录第2章 线程同步精要互斥量(mutex)只用非递归的mutex死锁条件变量不要用读写锁和信号量线程安全的单例模式实现使用shared_ptr实现copy-on-write 第2章 线程同步精要 线程同步四项原则,依照重要性排序: 尽量不要共享对象,共享对象优先选择不可修改的对象 使用高级并发编程构件 使用低级同步原语,只用非递归(不可重入)的互斥量和条件变量,不用读写锁、信号量 除原子级...

mimigu7053的博客 496

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

808

备战2020年金三银四,看这一篇面试文章就够了(合适各级Java人员)

本文不是原创。为整理所得!但是内容是很干货的!我看了也有帮助。做个分享。 企业开始上班,就意味着大批量的招聘需求正在路上。在即将到来的金三银四跳槽面试季,提前祝贺大家拿到大厂offer。前程似锦、前程万里、鹏程万里、蒸蒸日上、吉星高照!!!!!!! 下面列出这份 Java 面试问题列表包含的主题: 多线程,并发及线程基础 数据类型转换的基本原则 垃圾回收(GC) Java 集合框架 数组 字符串 GOF 设计模式 SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则 抽象...

ElegantHedgehog的博客 1816

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java面试必备:手写单例模式

面试官:请手写下几种常见的单例模式 我:好的(面带微笑),心里暗喜(送分题)。 没成想提笔便写出了如此豪放的代码,不堪回首,请原谅我的不羁! 此篇整理了几种常见的单例模式代码示例,再有面试官让手撕单例模式,便能心中有码,下笔有神。 为什么要有单例模式 实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象、缓存、系统全局配置对象等。这样可以就保证一个在全局使用的类不被频繁地创建与销毁,...

Java成魔之路 3163

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java面试题目大汇总(附参考答案)

足足准备了长达3个月的面试,终于在上周拿到了阿里的offer! 博主汇总整理了一份我面试之前看的一些Java面试题目,可以说是非常详细! 分享给大家,希望对正在面试Java岗位的朋友有帮助哈~~ (文末附参考答案) Java基础相关面试题目: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中的 Math.round(-1.5)

Java笔记 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【面试】网易游戏面试题目整理及答案(2)

网易游戏面试题目整理及题目(2)Java部分数据库部分算法部分操作系统Linux部分框架其他参考资料 Java部分 多线程安全问题 答:首先,了解什么情况下会产生线程安全问题?同时满足以下两个条件时: ①多个线程在操作共享的数据。 ②操作共享数据的线程代码有多条。 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导致线程安全问题的产生。 解决思路:将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程不可以参与运算。当前线程把这些代码都执行完毕后,其他线程才可以

小哲的博客 4770

Android面试题目总结

最近刚换了工作,在这里把各互联网公司问到的题目做下总结。涉及的内容都是Android研发应该掌握的基础问题,我把题目大概分为JAVA,设计模式,Android,网络,算法五类。最后边列一下自己看过的技术书籍,希望大家都能提高自己。

云涛的博客 3590

Java最新Java中级面试题及答案整理,java开发面试题目

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的。

2401_84691713的博客 798

单例模式超全整理(面试中常见的题目)

单例模式方法总结

人间诗画的专栏 789

2025年Java面试题目收集整理归纳

9、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?10、Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个master,另外 10 个选了另一个 master, 怎么办?35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证redis 中的数据都是热点数据?31、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

m0_73735578的博客 790

夜夜肝到秃顶,2022年Java面试题目收集整理归纳

10、Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个master,另外 10 个选了另一个 master, 怎么办?所有的面试题目都不是一成不变的,特别是大厂,上面的这些面试题目只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证redis 中的数据都是热点数据?31、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面).

m0_67698950的博客 1万+

2024年最全设计模式(4)——单例模式的学习及其六大战将,富士康java面试题整理

学习视频:本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取学习视频:[外链图片转存中…(img-QRkEhEQY-1715120721064)]大厂面试真题:[外链图片转存中…(img-XrKKePa4-1715120721065)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84558508的博客 959

Java高频面试题及答案整理(建议收藏)

JVMJDK线程安全Spring IOC容器。

m0_73735578的博客 1006

【大厂面试题】——如何在Python中实现单例模式?

点评:单例模式是指让一个类只能创建出唯一的实例,这个题目在面试中出现的频率极高,因为它考察的不仅仅是单例模式,更是对Python语言到底掌握到何种程度,建议大家用装饰器和元类这两种方式来实现单例模式,因为这两种方式的通用性最强,而且也可以顺便展示自己对装饰器和元类中两个关键知识点的理解。

python03012的博客 880

2020面试必知:中高级工程师面试题集整理(题目+答案)

这些面试题是我准备换工作的时候整理,没有重点。包括java基础,数据结构,网络,Android相关等等。 适合中高级工程师。由于内容过多,将会分为上下两部分。 希望能够帮到一些朋友,如果帮助到你,希望能够点个赞,需要整个文档的朋友私信我【58】即可。 没有单独分出来,面试题目都是穿插的。因为有些事外面试过程中遇到的,我就又加上去了。总之你弄懂了这些,基本是没有问题了。如果是bat那些企业,你还得...

Aerfa789的博客 5094
上一篇: 第四步 使用shell操作数据库,导入分析并将结果导出成txt文件
下一篇: 面试题目整理 关于服务器TIME_WAIT和CLOSE_WAIT
归来已是客
博客等级 码龄16年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值