设计模式
单例模式
单例模式要求两点:
- 保证类有且只有一个实例
- 提供一个访问的全局访问点
懒汉模式
懒汉模式特点:延迟创建实例对象。
class Singleton {
private:
//私有(或者protected)构造函数,防止类外创建对象
Singleton();
//static方法只能调用static数据成员,且该处只是声明instance,需要在类外定义(即初始化)
static Singleton *instance;
//严谨来看,复制构造函数和=操作符也要设置为私有
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
public:
//全局访问方法,定义为static因为通过类名调用只能是static方法
//非static方法不能通过类名调用
static Singleton *get_instance();
};
//static数据成员,需要在类外定义(定义才会分配空间)
Singleton* Singleton::instance = 0;
Singleton::Singleton() {
cout << "code" << endl;
}
Singleton* Singleton::get_instance() {
if (instance == 0)
//因私有构造函数,所以需要亲自创建对象
instance = new Singleton();
return instance;
}
int main(void)
{
Singleton *single = Singleton::get_instance();
return 0;
}
存在问题:单线程安全,当是多线程则会创建多个实例,因为多个线程判断instance == 0,导致创建多个实例。
参考《设计模式:可复用面向对象软件的基础》
方法1:加锁实现线程安全
class Singleton {
private:
Singleton();
//static数据成员,类中只是声明
static Singleton *instance;
public:
static Singleton *get_instance();
static pthread_mutex_t mutex;
};
//必须类外定义static数据成员,否则报错undefined symbol
pthread_mutex_t Singleton::mutex;
Singleton::Singleton() {
pthread_mutex_init(&mutex, NULL);
cout << "code" << endl;
}
Singleton* Singleton::instance = 0;
Singleton* Singleton::get_instance() {
if (instance == 0) {
pthread_mutex_lock(&mutex);
if (instance == 0)
instance = new Singleton();
pthread_mutex_unlock(&mutex);
}
return instance;
}
加锁存在的问题,当线程比较多时,效率低。
方法2:内部静态变量实现线程安全
class Singleton {
private:
Singleton();
public:
static Singleton *get_instance();
static pthread_mutex_t mutex;
};
//必须类外定义static数据成员,否则报错undefined symbol
pthread_mutex_t Singleton::mutex;
Singleton::Singleton() {
pthread_mutex_init(&mutex, NULL);
cout << "code" << endl;
}
Singleton* Singleton::get_instance() {
pthread_mutex_lock(&mutex);
static Singleton instance;
pthread_mutex_unlock(&mutex);
return &instance;
}
饿汉模式
class Singleton {
private:
Singleton() {};
static Singleton *instance;
public:
static Singleton* get_instance();
};
Singleton* Singleton::instance = new Singleton();
Singleton* Singleton::get_instance() {
return instance;
}
int main(void)
{
Singleton *single1 = Singleton::get_instance();
Singleton *single2 = Singleton::get_instance();
if (single1 == single2)
cout << "equal" << endl;
return 0;
}
2015年某wheel笔试题(未)
某wheel的笔试题目,很全面,分为数据结构、算法、数据库、计算机网络、大数据处理,每个范围一道题,考察的很全。
1. map-reduce处理 word-count问题
2. 多线程编程的问题
多线程编程很多公司都会问,还有设计模式中,比如单例模式中多线程锁的问题;
3. socket编程的问题
网络编程也经常被问到