面向对象设计与分析40讲(17)双重检查锁定(double-checked locking)范式

双重检查锁定(也称为“双重检查锁定优化”)是一种用于减少获取锁的开销的软件设计模式。它通过在获取锁之前测试锁定条件(即“锁提示”)来实现。只有在锁定条件检查表明需要锁定时才会进行锁定操作。

#include <atomic>
#include <mutex>class Singleton {public:static Singleton* GetInstance();private:Singleton() = default;static std::atomic<Singleton*> s_instance;static std::mutex s_mutex;
};Singleton* Singleton::GetInstance() {Singleton* p = s_instance.load(std::memory_order_acquire); // Aif (p == nullptr) { // 1st checkstd::lock_guard<std::mutex> lock(s_mutex);p = s_instance.load(std::memory_order_relaxed);if (p == nullptr) { // 2nd (double) checkp = new Singleton();s_instance.store(p, std::memory_order_release); // B}}return p;
}

memory_order_acquire主要保证两个事情:

  • 相同原子变量的release操作此处可见
  • 创建一个同步(synchronization)边界,任何读写都不会被重排到该操作之前

memory_order_release主要保证两个事情:

  • 内存写操作对acquire相同原子变量的线程可见
  • 创建一个同步(synchronization)边界,任何读写都不会被重排到该操作之后

即假设A、B两个线程同时运行于A、B点,B的release操作对线程A可见。同时p = new Singleton()的读写操作不会被重排到B点之后。

C++ 11提供了基于该范式实现的基础设施std::once_flag和std::call_once:

#include <mutex>
#include <optional> // Since C++17// Singleton.h
class Singleton {public:static Singleton* GetInstance();private:Singleton() = default;static std::optional<Singleton> s_instance;static std::once_flag s_flag;
};// Singleton.cpp
std::optional<Singleton> Singleton::s_instance;
std::once_flag Singleton::s_flag{};Singleton* Singleton::GetInstance() {std::call_once(Singleton::s_flag,[]() { s_instance.emplace(Singleton{}); });return &*s_instance;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Block总结

一、简介 Block代码块&#xff0c;本质上它和其它变量类似&#xff0c;不同的是代码块传递的是函数体&#xff0c;类似于selector的功能。调用和其它标准函数一样。声明方式有差别。二、代码块定义例&#xff1a;int ( ^ MyBlock)( int ) ^ (int m){ return m * 3; };1 …

计算机PPT03,南京大学计算机网络课件03.ppt

第3讲数据链路层 3 1数据链路层的基本概念 一 链路与数据链路 链路 link 就是一条无源的点到点的物理线路段 中间没有任何其他的交换结点 数据链路 datalink 则是另一个概念 这是因为当需要在一条线路上传送数据时 除了必须有一条物理线路外 还必须有一些必要通信协议来控制这些…

NSThread使用总结

一、创建NSThread&#xff1a;(1)使用NSThread类方法&#xff1a;detachNewThreadSelector:toTarget:withObject:该方法3个参数分别指定了线程执行的方法&#xff0c;目标&#xff0c;和传递的对象。但是要注意&#xff0c;使用这个方法时&#xff0c;并没有返回任何对象供操作…

甘肃计算机教室中标,大单纷至沓来 甘肃百亿工程浪潮电脑中标8000台

近日&#xff0c;浪潮电脑教育市场再传佳讯&#xff0c;在甘肃百亿工程项目中&#xff0c;凭借出众的产品性价比和针对细分市场的定制化解决方案&#xff0c;浪潮电脑一举拿下了8000台的采购大单&#xff0c;这是继宁夏中标之后浪潮电脑在百亿工程中的又一成功典范&#xff0c;…

NSOperationQueue简介

一、NSOperationQueue简介1.概述&#xff1a;NSOperationQueue类管理NSOperation对象的执行。NSOperationQueue可以被称为操作队列&#xff0c;NSOperation可以被称为操作。操作被添加到操作队列之后&#xff0c;操作队列会根据操作对象的优先级或者相互之间的依赖关系来执行操…

计算机 窗口打开的方法,如何打开命令行窗口?两种实用的方法介绍

Windows系统中常常会用到命令行窗口&#xff0c;那么我们该如何打开命令行窗口?接下来&#xff0c;小编为大家介绍两种实用的打开命令行窗口的技巧&#xff0c;再也不必担忧如何打开命令行窗口的烦恼了。第一种打开方法1.点击自己的电脑中的开始菜单&#xff0c;在菜单中找到运…

GCD简介一:基本概念和Dispatch Queue

一、什么是GCD&#xff1f;Grand Central Dispatch或者GCD&#xff0c;是一套低层API&#xff0c;提供了一种新的方法来进行并发程序编写。从基本功能上讲&#xff0c;GCD有点像NSOperationQueue&#xff0c;他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地…

大学生计算机二级大集报名最好,在校大学生如何报名计算机二级?

2009-12-05 回答首先要根据你的所学专业来衡量自己考哪项计算级二级有c语言&#xff0c; vb&#xff0c; vf&#xff0c; java&#xff0c; access&#xff0c; c 六项可选考其中一个你会的 考下来能拿计算机二级了考试分两部分&#xff0c;上机和笔试。笔试就是一些基本的操作…

GCD简介二:多核心的性能

一、概念为了在单一进程中充分发挥多核的优势&#xff0c;我们有必要使用多线程技术。在低层&#xff0c;GCD全局dispatch queue仅仅是工作线程池的抽象。这些队列中的Block一旦可用&#xff0c;就会被dispatch到工作线程中。提交至用户队列的Block最终也会通过全局队列进入相同…

怪哉翻译软件测试,[东方朔传翻译]东方朔传·怪哉原文与翻译

东方朔传怪哉原文与翻译原文&#xff1a;《太平广记》卷四七三引《东方朔传》汉武帝幸⑦甘泉&#xff0c;驰道中有虫&#xff0c;赤色&#xff0c;头牙齿耳鼻尽具&#xff0c;观者莫识①。帝乃使东方朔视之&#xff0c;还对②曰&#xff1a;“此虫名怪哉。昔时拘系⑧无辜&#…

GCD简介三:Dispatch Sources

一、何为Dispatch Sources简单来说&#xff0c;dispatch source是一个监视某些类型事件的对象。当这些事件发生时&#xff0c;它自动将一个block放入一个dispatch queue的执行例程中。我们到底讨论哪些事件类型&#xff1f;下面是GCD 10.6.0版本支持的事件&#xff1a;Mach por…

GCD简介四:挂起,目标指定,信号量

一、Dispatch Queue挂起dispatch queue可以被挂起和恢复。使用 dispatch_suspend函数来挂起&#xff0c;使用 dispatch_resume 函数来恢复。这两个函数的行为是如你所愿的。另外&#xff0c;这两个还是也可以用于dispatch source。一个要注意的地方是&#xff0c;dispatch que…

如何自己做网站发布到服务器上面,怎么做网站 四步教你搭建自己的网站

1、购买域名如果想要做一个自己的网站&#xff0c;购买一个自己喜欢的域名就是首先要做的&#xff01;当你购买好自己的域名&#xff0c;就走出了搭建自己网站的第一步&#xff01;2、购买空间/主机/服务器空间/主机/服务器&#xff0c;看着好像很复杂&#xff0c;其实很简单&a…

GCD简介五:补充

1.GCD在iOS4.0及以上可用。2.GCD中&#xff0c;主线程队列是串行的&#xff1b;全局队列是并行的&#xff0c;并由整个进程共享&#xff1b;用户自建队列&#xff0c;在iOS4.3以下&#xff0c;只能是串行&#xff0c;iOS4.3及以上&#xff0c;可以是并行的。3.dispatch_suspend…

ajax delete 传递参数,springMVC使用PUT、DELETE方法传递参数解决方案

在web.xml中新增过滤器HiddenHttpMethodFilterorg.springframework.web.filter.HiddenHttpMethodFilterHiddenHttpMethodFilter/*需要注意的是&#xff0c;只有context-type&#xff1a;application/x-www-form-urlencoded的请求才会被过滤。该过滤器的核心方法如下&#xff1a…

ARC简介

1、简介&#xff1a;ARC(Automatic Reference Counting)&#xff0c;自动引用计数&#xff0c;需要XCode4.2和SDK5.0的支持。它是一个在编译期间工作的技术&#xff0c;编译器在编译的时候会根据变量的作用域为objective-c变量添加合适的retain、release、autorelease等函数。原…

微信验证码无法连接到服务器,微信无法连接到服务器1237解决方法

太多朋友在使用微信过程中出现微信无法连接到服务器1237的问题&#xff0c;出现这个问题的原因有很多种&#xff0c;接下来小编带大家找出问题原因&#xff0c;然后成功解决这个问题。以下是网友们成功解决此问题的方法&#xff0c;大家可以参考一下方法一&#xff1a;首先重启…

iOS后台任务

一、概览1.从iOS4.0开始&#xff0c;系统添加了多任务特征&#xff0c;允许应用在按下Home键之后&#xff0c;继续执行后台任务。大部分应用在进入后台之后就进入了挂起状态&#xff0c;只有那些为用户提供重要服务的App能够在进入后台之后继续运行一段时间。2.一般情况下&…

王者荣耀服务器维护bug,8月23日王者荣耀ios版更新一直显示维护是什么情况?更新出现bug 附处理方法...

相信很多喜爱玩王者荣耀的游戏玩家可以知道今天是王者荣耀星计划更新的日子&#xff0c;但是有很多苹果手机的小伙伴出现了一个问题&#xff0c;那就是无法进入游戏&#xff0c;甚至是更新十分的缓慢&#xff0c;在这里本文为您带来最新的解决方法&#xff01;苹果手机微信区一…

服务器任务栏不显示程序,Win10任务栏不显示应用程序标签怎么办?

Win10任务栏不显示应用程序标签怎么办?执拗的人才会一条路走到黑&#xff0c;多个朋友多条路&#xff0c;多个方法多种选择。关于Win10任务栏不显示应用程序标签&#xff0c;一般是explorer进程出现故障导致&#xff0c;哦!忘记说了Win10系统下这东东改了个好听的名字&#xf…