单例模式
来源:互联网 发布:装完软件蓝屏 编辑:程序博客网 时间:2024/06/06 00:59
定义
一个类只能创建一个实例,如人任务管理器,正在打印的任务等.
Singleton 模式是设计模式中最为简单、最为常见、最容易实现的.
实现
typedef int *SINGLETON; /* 定义自己的类型 */
SINGLETON singleton = NULL;
SINGLETON *get_singleton(void)
{
if (NULL == singleton)
{
singleton = calloc(1, sizeof(SINGLETON));
if (NULL == singleton)
{
return NULL;
}
/* SINGLETON 初始化 */
}
return singleton;
}
这是一个不安全的方法, 适用于其他线程或者模块在初始化时是有序的。
但是,在多个线程或者多模块同时调用时,可能存在不安全情形,多个线程或者模块同时calloc singleton的情况。 为了避免出现这种情况,实现方式如下:
typedef int *SINGLETON; /* 定义自己的类型 */
SINGLETON *singleton = NULL; //保证全局都能够使用
pthread_mutex_t singleton_lock=PTHREAD_MUTEX_INITIALIZER; //保证同时初始化的只有一个
SINGLETON *init_singleton(void)
{
pthread_mutex_lock(&singleton_lock);
if (NULL == singleton) //保证全局只初始化一次
{
singleton = calloc(1, sizeof(SINGLETON));
if (NULL == singleton)
{
pthread_mutex_unlock(&singleton_lock);
return NULL;
}
/* SINGLETON 初始化 */
}
pthread_mutex_unlock(&singleton_lock);
return singleton;
}
单例适用场景:
在模块化设计时,应该遵循耦合度越低越好,但是总是存在一些公共的调用函数库或者模块,这些公共的调用函数库或者模块有以下几个特点:
1、需要被其他的模块使用
2、其他模块之间并不知道对方使用会去调用或者初始化
3、公共的调用函数库或者模块却希望在整个系统中初始化一次。
场景举例:
1.线程池(整个系统希望只有那么线程,其他模块不能线程)。
2. 内存池,整个系统中只能存在这么一个内存池。
3. 配置文件: 读取一次就全局使用了.
4. 日志文件: 打开一次就全局使用了,否则内容也不好追加.
总结:在实际应用中SINGLETON很可能是一个数据结构, 这个结构中必然需要一把锁,来保证对全局变量singleton使用的正确性。
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- 深度学习大数据
- linux下grep的时候报Binary file stdout.log matches解决方法
- LeetCode笔记:165. Compare Version Numbers
- Android Studio 出现 Gradle's dependency cache may be corrupt 错误分析
- Android中的Service
- 单例模式
- Java初学者常见错误
- PAT甲级 1005:Spell it Right
- cocos2d_x之AnySDK接入流程
- 基于C语言sprintf函数的深入理解
- Java实现的拦截器
- android 点击两次后退键退出程序
- MVC+EF(9)
- Android——EditText自定义边框、圆角和其常用属性总结