懂做网站的人就是好,哈尔滨建设网站哪家好,自己网站联系电话修改怎么做,石家庄住房和城乡建设厅官方网站目录
懒汉模式和饿汉模式
区别
示例
懒汉模式线程不安全
懒汉模式线程安全 懒汉模式内部静态变量线程安全
饿汉式线程安全 指的是在系统生命周期内#xff0c;只产生一个实例。
懒汉模式和饿汉模式
分为懒汉式和饿汉式
区别 创建时机和线程安全
线程安全#xff1…目录
懒汉模式和饿汉模式
区别
示例
懒汉模式线程不安全
懒汉模式线程安全 懒汉模式内部静态变量线程安全
饿汉式线程安全 指的是在系统生命周期内只产生一个实例。
懒汉模式和饿汉模式
分为懒汉式和饿汉式
区别 创建时机和线程安全
线程安全多线程共享资源的过程中线程安全通过同步机制保证各个线程正确执行。
懒汉式比较懒只有在用到的时候才去想我怎么才能用到所以只有当要用到该对象时才去创建实例。线程不安全。
原因懒汉式的实例是在使用的时候才去申请这个时候如果还没有new 出来实例恰好又有多个线程进来访问创建对象的话就会有问题。
解决方法加锁。
饿汉式害怕自己饿着所以在一开始就准备好自己需要的东西。所以是一运行程序就创建实例。在线程还未创建之前就已经创建出了实例所以一定是线程安全的。
执行效率
懒汉式为保证线程安全需要加同步锁所以执行比饿汉式要慢一些。
内存使用
懒汉式在需要的时候才去创建实例对象不浪费内存
饿汉式一开始就去创建会占据空间浪费内存。
示例
懒汉模式线程不安全
//懒汉模式:线程不安全
SingleCase * SingleCase::m_SingleCase NULL;SingleCase * SingleCase::GetInstance()
{if (m_SingleCase NULL){m_SingleCase new SingleCase();}return m_SingleCase;
}
创建5个线程运行结果
构造了三次线程不安全适合单线程使用 注可以将构造、析构、拷贝赋值和拷贝构造都改为private禁止其他类进行操作。
懒汉模式线程安全
//懒汉模式线程安全
SingleCase * SingleCase::m_SingleCase NULL;
std::mutex SingleCase::m_mutex;
SingleCase * SingleCase::GetInstance()
{if(m_SingleCase NULL){//双检锁//假如线程1和线程2同时到达m_mutex.lock();//此时线程1进入判断m_SingleCase为空if (m_SingleCase NULL){//实例化对象m_SingleCase new SingleCase();}//结束后释放锁此时线程2进入m_SingleCase已经被实例化可以避免多次实例m_mutex.unlock();}return m_SingleCase;
}
双检锁
1.第一层if判断完成实例化之后之后的线程不需要进入等待提高了效率
2.第二层if判断防止对象被多次实例化。
运行结果 懒汉模式内部静态变量线程安全
//懒汉模式内部静态
SingleCase SingleCase::GetInstance()
{static SingleCase single;return single;
}
运行结果 饿汉式线程安全
SingleCase * SingleCase::m_SingleCase new SingleCase();
SingleCase * SingleCase::GetInstance()
{return m_SingleCase;
}
运行结果