朋友圈网站广告怎么做挂网站需要什么服务器
web/
2025/10/2 2:06:21/
文章来源:
朋友圈网站广告怎么做,挂网站需要什么服务器,设计欣赏心得体会,wordpress电影影视主题公园C之单例模式 前言介绍1、单例模式是什么#xff1f;1.1 实现单例模式的三个要点1.2 单例模式分类 2. 懒汉式2.1 懒汉实现#xff1a;基础方法2.2 懒汉实现#xff1a;基于单锁2.3 懒汉实现#xff1a;基于双重检测锁2.4 懒汉实现#xff1a;基于双重检测锁和资源管理2.4.1… C之单例模式 前言介绍1、单例模式是什么1.1 实现单例模式的三个要点1.2 单例模式分类 2. 懒汉式2.1 懒汉实现基础方法2.2 懒汉实现基于单锁2.3 懒汉实现基于双重检测锁2.4 懒汉实现基于双重检测锁和资源管理2.4.1 智能指针方式2.4.2 静态嵌套类方式 2.5 懒汉实现基于局部静态对象 3. 饿汉式3.1 饿汉实现基础方法 4. 总结 前言
单例模式Singleton Pattern是 面向对象中最简单的设计模式之一。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类该类负责创建自己的对象同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式可以直接访问不需要实例化该类的对象。
单例模式是一种创建型设计模式它确保一个类只有一个实例并提供了一个全局访问点来访问该实例。
优点通过单例模式的设计使得创建的类在当前进程中只有一个实例并提供一个全局性的访问点这样可以规避因频繁创建对象而导致的 内存飙升 情况。
介绍
意图保证一个类仅有一个实例并提供一个访问它的全局访问点。
主要解决一个全局使用的类频繁地创建与销毁。
何时使用当您想控制实例数目节省系统资源的时候。
如何解决判断系统是否已经有这个单例如果有则返回如果没有则创建。
关键代码构造函数是私有的。
优点
1、在内存里只有一个实例减少了内存的开销尤其是频繁的创建和销毁实例比如管理学院首页页面缓存。 2、避免对资源的多重占用比如写文件操作。 缺点没有接口不能继承与单一职责原则冲突一个类应该只关心内部逻辑而不关心外面怎么样来实例化。
1、单例模式是什么
在面向对象编程中有时候我们希望一个类只有一个实例化的对象比如线程池缓存等。这些类有且只有一个唯一的实例这种设计模式被称为单例模式。
1.1 实现单例模式的三个要点
1私有化构造函数这样外界就无法自由地创建类对象进而阻止了多个实例的产生。 2类定义中含有该类的唯一静态私有对象静态变量存放在全局存储区且是唯一的供所有对象使用。 3用公有的静态函数来获取该实例提供了访问接口。
1.2 单例模式分类
单例模式有两种主要实现方法懒汉模式和饿汉模式。
懒汉模式特点是当外界调用时才进行实例化饿汉模式特点是一开始就对实例进行初始化调用时直接返回这个构建好的实例。
2. 懒汉式
懒汉模式特点是当外界调用时才进行实例化。
2.1 懒汉实现基础方法
是否多线程安全否 实现难度易 描述这种方式是最基本的实现方式这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized所以严格意义上它并不算单例模式。 缺点一个是线程安全另一个是内存泄漏。 线程安全是因为在多线程场景下有可能出现多个线程同时进行new操作的情况没通过加锁来限制。 内存泄漏是因为使用了new在堆上分配了资源那么在程序结束时也应该进行delete确保堆中数据释放。
public class Singleton { // 静态私有对象private static Singleton instance; // 私有构造函数private Singleton (){} // 公有接口获取唯一实例public static Singleton getInstance() { if (instance null) { instance new Singleton(); } return instance; }
}这种方式在单线程下没有问题但是如果多线程模式下当唯一实例还没有创建两个线程同时调用getinstance就可能同时创建对象导致错误。
2.2 懒汉实现基于单锁
是否多线程安全是 实现难度较易 描述这种方式采用单锁机制有可能造成阻塞。
Singleton*Singleton::getInstance(){m.lock();if (_instance nullptr)_instance new Singleton;m.unlock();return _instance;
}加锁又会带来另外的性能问题如果每个线程每次获取实例都加锁有可能造成阻塞的发生。实际上上锁的目的是为了防止有多个线程在实例未被初始化的情况下同时对他进行初始化如果实例已经被创建了就不需要考虑这个问题了所以就可以采用二次加锁的方法来提高程序的性能。
2.3 懒汉实现基于双重检测锁
是否多线程安全是 实现难度较复杂 描述这种方式采用双锁机制可以确保线程安全且在多线程情况下能保持高性能。 getInstance() 的性能对应用程序很关键。
Singleton*Singleton::getInstance(){if (_instance nullptr){m.lock();if (_instance nullptr){_instance new Singleton;}m.unlock();}return _instance;
}接下来我们再解决内存泄漏(资源释放)问题对懒汉式实现进行进一步的改进。
2.4 懒汉实现基于双重检测锁和资源管理
是否多线程安全是 实现难度较复杂 描述这种方式采用双锁机制可以确保线程安全且在多线程情况下能保持高性能。并且加入资源管理机制以达到对资源的释放的目的。 我们加入资源管理机制以达到对资源的释放的目的解决方法有两个智能指针静态嵌套类。
2.4.1 智能指针方式
将实例指针更换为智能指针另外智能指针在初始化时还需要人为添加公有的毁灭函数因为析构函数私有化了。
#include iostream
#include mutex
using namespace std;// 单例模式演示类
class Singleton
{
public:
// 公有接口获取唯一实例static shared_ptrSingleton getInstance() {
// 若为空则创建if (instance nullptr) {
// 加锁保证线程安全
// 如果两个线程同时进行到这一步一个线程继续向下执行时另一个线程被堵塞
// 等锁解除后被堵塞的线程就会跳过下面的if了因为此时实例已经构建完毕lock_guardmutex l(m_mutex);if (instance nullptr) {cout 实例为空开始创建。 endl;instance.reset(new Singleton(), destoryInstance);cout 地址为: instance endl;cout 创建结束。 endl;}}else {cout 已有实例返回。 endl;}return instance;
}
// 毁灭实例
static void destoryInstance(Singleton* x) {cout 自定义释放实例 endl;delete x;
}private:
// 私有构造函数
Singleton() {cout 构造函数启动。 endl;
};// 私有析构函数
~Singleton() {cout 析构函数启动。 endl;
};private:
// 静态私有对象
static shared_ptrSingleton instance;
// 锁
static mutex m_mutex;
};// 初始化
shared_ptrSingleton Singleton::instance;
mutex Singleton::m_mutex;应用智能指针后在程序结束时它自动进行资源的释放解决了内存泄漏的问题。
2.4.2 静态嵌套类方式
类中定义一个嵌套类初始化该类的静态对象当程序结束时该对象进行析构的同时将单例实例也删除了。
#include iostream
#include mutex
using namespace std;// 单例模式演示类
class Singleton
{
public:
// 公有接口获取唯一实例
static Singleton* getInstance() {
// 若为空则创建if (instance nullptr) {
// 加锁保证线程安全
// 如果两个线程同时进行到这一步一个线程继续向下执行时另一个线程被堵塞
// 等锁解除后被堵塞的线程就会跳过下面的if了因为此时实例已经构建完毕lock_guardmutex l(m_mutex);if (instance nullptr) {cout 实例为空开始创建。 endl;instance new Singleton();cout 地址为: instance endl;cout 创建结束。 endl;}}else {cout 已有实例返回。 endl;}return instance;
}private:
// 私有构造函数
Singleton() {cout 构造函数启动。 endl;};// 私有析构函数
~Singleton() {
cout 析构函数启动。 endl;
};// 定义一个删除器
class Deleter {
public:
Deleter() {};
~Deleter() {
if (instance ! nullptr) {cout 删除器启动。 endl;delete instance;instance nullptr;}
}
};// 删除器是嵌套类,当该静态对象销毁的时候也会将单例实例销毁
static Deleter m_deleter;
private:
// 静态私有对象
static Singleton* instance;
// 锁
static mutex m_mutex;
};// 初始化
Singleton* Singleton::instance nullptr;
mutex Singleton::m_mutex;
Singleton::Deleter Singleton::m_deleter;2.5 懒汉实现基于局部静态对象
是否多线程安全是 实现难度一般 描述C11后规定了局部静态对象在多线程场景下的初始化行为只有在首次访问时才会创建实例后续不再创建而是获取。若未创建成功其他的线程在进行到这步时会自动等待。注意C11前的版本不是这样的。
因为有上述的改动所以出现了一种更简洁方便优雅的实现方法基于局部静态对象实现。
#include iostream
#include mutex
using namespace std;// 单例模式演示类
class Singleton
{
public:
// 公有接口获取唯一实例
static Singleton getInstance() {cout 获取实例 endl;static Singleton instance;cout 地址为: instance endl;return instance;}
private:
// 私有构造函数
Singleton() {cout 构造函数启动。 endl;};// 私有析构函数
~Singleton() {cout 析构函数启动。 endl;};
};3. 饿汉式
饿汉模式特点是一开始就对实例进行初始化调用时直接返回这个构建好的实例。
3.1 饿汉实现基础方法
是否多线程安全是 实现难度易 描述这种方式比较常用但容易产生垃圾对象。 优点没有加锁执行效率会提高。第一次调用才初始化避免内存浪费。 缺点类加载时就初始化浪费内存。必须加锁 synchronized 才能保证单例但加锁会影响效率。 它基于 classloader 机制避免了多线程的同步问题不过instance 在类装载时就实例化虽然导致类装载的原因有很多种在单例模式中大多数都是调用 getInstance 方法 但是也不能确定有其他的方式或者其他的静态方法导致类装载这时候初始化 instance 显然没有达到 lazy loading 的效果。
#include iostream
#include mutex
using namespace std;// 单例模式演示类
class Singleton
{
public:
// 公有接口获取唯一实例
static Singleton* getInstance() {cout 获取实例 endl;cout 地址为: instance endl;return instance;}
private:
// 私有构造函数
Singleton() {cout 构造函数启动。 endl;
};// 私有析构函数
~Singleton() {cout 析构函数启动。 endl;
};private:
// 静态私有对象
static Singleton* instance;
};// 初始化
Singleton* Singleton::instance new Singleton();main还没开始实例就已经构建完毕获取实例的函数也不需要进行判空操作因此也就不用双重检测锁来保证线程安全了它本身已经是线程安全状态了。 但是内存泄漏的问题还是要解决的这点同懒汉是一样的。可以通过智能指针和静态嵌套实现。
4. 总结
一般情况下建议使用基于双重检测锁和资源管理搭配智能指针的懒汉方式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85368.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!