设计模式-单例模式

设计模式

单例模式

单例模式要求两点:

  1. 保证类有且只有一个实例
  2. 提供一个访问的全局访问点

懒汉模式

懒汉模式特点:延迟创建实例对象。

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编程的问题

网络编程也经常被问到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值