//
// main.cpp
// lazy_singleton_pattern
//
// Created by apple on 2019/3/8.
// Copyright © 2019年 apple. All rights reserved.
//
#include <iostream>
class Example
{
private:
static Example *single;//静态变量
Example();
public:
static Example *GetSingleton();
static void DestorySingle();
void test();
};
Example *Example::single = NULL;//初始化静态变量为null
Example::Example(){};
Example *Example::GetSingleton()
{
if (single == NULL) {//在if判断中,存在线程安全问题
single = new Example();
}
return single;
}
void Example::DestorySingle()
{
if (single != NULL)
{
delete single;
single = NULL;
}
}
void Example::test()
{
std::cout<<this<<std::endl;
}
int main(int argc, const char * argv[]) {
Example *a = Example::GetSingleton();
a->test();
Example::DestorySingle();
Example *b = Example::GetSingleton();
a->test();
b->test();
return 0;
}
0x100454ef0
0x100454ef0
0x100454ef0
Program ended with exit code: 0
懒汉单例模式,什么是懒汉单例模式?懒汉单例模式不会迫切的需要单例对象,即在第一次需要该单例实例的时候才会生成该单例对象,之后再获取该单例实例时,该单例实例就是第一次获取时所生成的并返回的静态变量。
根据单例模式特点,以一个静态方法返回一个静态变量,同时以懒汉为特点。我们可以这么做,在类加载的时候,将静态变量初始化为null。而根据懒汉的特点,我们需要在第一次调用静态方法时修改该静态变量的值,所以可以在静态方法中使用if语句判断该静态变量是否有值,若没有值,则给该静态变量重新赋值,再返回该静态变量。
由上述创建过程会引发线程安全问题。假设同时有1000个线程在运行,并且该静态变量为null,此时这1000个线程同时调用静态方法,根据分时操作系统的特点,那么必然会存在部分线程在执行到if语句时,部分线程尚未执行到if语句,或部分线程已经执行过if语句,此时可能存在在执行对静态变量赋值操作的时候,该静态变量已由其他线程赋值,这样就导致了在同一时刻,创建了许多静态变量,并且许多静态变量都尚未使用就被抛弃了。这就是该懒汉单例模式的线程不安全性,
针对线程不安全,本文不贴代码来解决线程不安全的问题,仅提供解决思路。既然是由同一时刻大量线程访问导致的线程不安全问题,那么我们可以让同一时刻只能有1个线程访问可能导致线程不安全的代码段,在该代码段执行结束之后,其他线程才能执行该代码段。即对代码段加锁保护该代码段,以达到同一时刻最多一个线程能够访问的目的。
网友评论