网站备案接入商变更,钢筋网片厂家电话,枣阳网站开发公司哪家好,熟人做网站怎么收钱有些对象只需要有一个#xff0c;比如线程池、缓存和注册表等。
对比全局变量#xff0c;其需要在程序开始就创建好对象#xff0c;如果这个对象比较耗资源#xff0c;而在后面的执行过程中又一直没有用到#xff0c;就造成了浪费。
class Singleton {private:static Si…有些对象只需要有一个比如线程池、缓存和注册表等。
对比全局变量其需要在程序开始就创建好对象如果这个对象比较耗资源而在后面的执行过程中又一直没有用到就造成了浪费。
class Singleton {private:static Singleton instance;Singleton(){}publicstatic Singleton getInstance() {// 多线程环境下可能先后判断为trueif ( instance null ) {instance new Singleton();}return instance;}
}
双重检查锁
// 解决指针没有析构和多线程问题
class Singleton{private:static std::shared_ptrSingleton instance;static std::mutex m_mutex;Singleton(){}publicstatic Singleton getInstance() {// 多线程环境下可能先后判断为trueif ( instance null ) {std::lock_guardstd::mutex lk(m_mutex);instance std::shared_ptrSingleton(new Singleton());}return instance;}
}
上述代码还存在问题是new Singleton()口语被抽象为下面的语句
memory allocate(); //1分配对象的内存空间
instance memory; //3设置instance指向刚分配的内存地址此时对象还未初始化
new(instance); //2初始化对象
那么另一线程在判断是否为null的时候可能得到一个为完全初始化的instance。
我们可以通过volatile对变量进行限制防止指令重排
static std::shared_ptrSingleton volatile instance;
在Java中这样应该就可以了c好像还有点问题具体的可以看下最后贴的参考文献。
最推荐的懒汉式单例模式(magic static)
// 解决指针没有析构和多线程问题
class Singleton{private:Singleton(){}publicstatic Singleton getInstance() {static Singleton instrance;return instance;}
}
魔法静态变量是C11的核心语言功能特性提案:N2660 - Dynamic Initialization and Destruction with Concurrency, 最早在GCC2.3 / Clang2.9 / MSVC19.0等编译器得到支持。
这种方法又叫做 Meyers SingletonMeyers的单例 是著名的写出《Effective C》系列书籍的作者 Meyers 提出的。所用到的特性是在C11标准中的Magic Static特性
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization. 如果当变量在初始化的时候并发同时进入声明语句并发线程将会阻塞等待初始化结束。
这样保证了并发线程在获取静态局部变量的时候一定是初始化过的所以具有线程安全性。
单例模式volatile_单例模式 volatile_这瓜保熟么的博客-CSDN博客
C 单例模式_c单例模式_WhiteTian的博客-CSDN博客
C和双重检查锁定模式(DCLP)的风险_dclp认证_nodeathphoenix的博客-CSDN博客