#include <iostream>
#include <memory>
#include <mutex> class SingletonOld {
static std::shared_ptr<SingletonOld> handle_;
static std::mutex handle_mutex_; int data_ = 0; public:
static auto create() {
std::lock_guard<std::mutex> lock(handle_mutex_);
if (handle_ == nullptr) {
handle_.reset(new SingletonOld); // Using `make_shared` is error, as `SingletonOld` constructor is private
// to `shared_ptr`, `allocator` and any class else.
// handle_ = std::make_shared<SingletonOld>();
}
return handle_;
} int get_data() { return data_; }
void set_data(int data) { data_ = data; } private:
SingletonOld(const SingletonOld &) = delete;
SingletonOld &operator=(const SingletonOld &) = delete; SingletonOld() {};
}; std::shared_ptr<SingletonOld> SingletonOld::handle_;
std::mutex SingletonOld::handle_mutex_; class Singleton {
int data_ = 0; public:
static Singleton &create() {
// 1. C++11: If control enters the declaration concurrently while the
// variable is being initialized, the concurrent execution shall wait for
// completion of the initialization.
// 2. Lazy evaluation.
static Singleton s; return s;
} int get_data() { return data_; }
void set_data(int data) { data_ = data; } private:
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete; Singleton() {}
}; int main() {
auto p = SingletonOld::create();
std::cout << p->get_data() << std::endl; // 0
p->set_data(1);
auto q = p;
std::cout << q->get_data() << std::endl; // 1 Singleton &s = Singleton::create();
Singleton &r = s;
r.get_data();
std::cout << s.get_data() << std::endl; // 0
s.set_data(1);
std::cout << r.get_data() << std::endl; // 1 return 0;
}

  

Singleton in C++11 style的更多相关文章

  1. Google C++ Style Guide在C++11普及后的变化

    转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...

  2. IE10 11的css hack

    一.@media -ms-high-contrast @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){ ...

  3. .NET设计模式(2):单件模式(Singleton Pattern)

    转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...

  4. C++ 11和C++98相比有哪些新特性

    此文是如下博文的翻译: https://herbsutter.com/elements-of-modern-c-style/ C++11标准提供了许多有用的新特性.这篇文章特别针对使C++11和C++ ...

  5. C++11:使用 auto/decltype/result_of使代码可读易维护

    C++11 终于加入了自动类型推导.以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用"原生态"的自动类型推导了! C++引入自动的类型推导,并不是在向动态语言(强 ...

  6. C++闭包: Lambda Functions in C++11

    表达式无疑是C++11最激动人心的特性之一!它会使你编写的代码变得更优雅.更快速! 它实现了C++11对于支持闭包的支持.首先我们先看一下什么叫做闭包 维基百科上,对于闭包的解释是: In progr ...

  7. [转载]如何在C++03中模拟C++11的右值引用std::move特性

    本文摘自: http://adamcavendish.is-programmer.com/posts/38190.htm 引言 众所周知,C++11 的新特性中有一个非常重要的特性,那就是 rvalu ...

  8. Singleton(单例)

    意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...

  9. C++中多线程与Singleton的那些事儿

    前言 前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton. 看到这个题目后,第一个想法就是用Scott Meyer在<Effe ...

随机推荐

  1. Ionic发布成android

    目前环境 1.ant的版本是1.9.4 2.jdk的版本是1.7 3.ionic安装版本是1.5.5 4.cordova版本是5.1.1 经测试,虽然ionic上面写的支持的最低版本是android- ...

  2. (转)ArcGIS制图技巧

    ArcGIS制图技巧(转载自新浪博客)   1  引言 1.1  制图的目的 随着GIS在各行各业的深入应用,各信息化部门和生产单位都逐渐建立起自己的GIS的应用,同时积累了大量的地理数据.随着应用深 ...

  3. iOS静态分析举例

    XCode-> Product -> Analyze 即可进行iOS静态代码分析.静态分析能发现的问题包括以下几种类型: 1.逻辑错误:访问空指针或未初始化的变量等: 2.内存管理错误:如 ...

  4. TabLayout 简单使用。

    先上效果图 在使用TabLayout 之前需要导入design包. 我使用的是android studio 只要在build.gradle中加入 compile 'com.android.suppor ...

  5. MapReduce工作原理讲解

    第一部分:MapReduce工作原理 MapReduce 角色•Client :作业提交发起者.•JobTracker: 初始化作业,分配作业,与TaskTracker通信,协调整个作业.•TaskT ...

  6. JS最基础的获取元素的值实现加减乘除运算

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Kafka安装

    一.下载kafka: http://kafka.apache.org/downloads 二.解压 tar -zxvf kafka_2.10-0.10.0.1.tgz 三.kafka需要用到zooke ...

  8. java利用Aspose.slides.jar将本地ppt文档转化成pdf(完美破解版 无水印 无中文乱码)

    下载aspose.slides-15.9.0.jar包 http://pan.baidu.com/s/1jH3ZNbK JAVA代码 package webViewer; import java.io ...

  9. redhat yum 从 iso 安装

    背景: 1)yum 在没有注册的redhat中无法使用,不能去自动搜索redhat的库 2)使用者不能上网 方法摘自网络,就是下载ISO文件,yum的下载点指向ISO的mount后(也就是解压缩)的目 ...

  10. loadrunner ---模拟多IP登录

    1.打开HP LoadRunner ->Tools ->IP Wizard