设计模式-单例模式

c++实现单例模式

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
    // 禁止拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
private:
    Singleton() {}
};

在上面的实现中,我们使用了静态变量来保存单例实例,并通过 getInstance 方法来获取该实例。由于静态变量是在程序运行时自动初始化的,因此可以保证在第一次调用 getInstance 方法时创建单例实例。此外,为了防止通过拷贝构造函数和赋值运算符创建新的实例,我们将其禁止。


在多线程环境中,单例模式需要考虑线程安全性,否则可能会创建多个实例。以下是使用双重检查锁定实现线程安全的单例模式的C++代码:

class Singleton {
public:
    static Singleton& getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return *instance;
    }
    // 禁止拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
private:
    Singleton() {}
    static Singleton* instance;
    static std::mutex mutex;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;

在上面的实现中,我们使用了双重检查锁定来保证线程安全。首先,在第一次调用 getInstance 方法时,如果实例未被创建,多个线程可能会同时进入第一个 if 语句块。因此,我们需要使用 std::lock_guard 来保证只有一个线程可以创建实例。然后,在同步块内部,我们再次检查实例是否已被创建。这是因为,如果多个线程在第一个 if 语句块之后进入同步块,其中一个线程可能已经创建了实例。因此,我们需要再次检查实例是否已被创建,以避免创建多个实例。最后,我们使用静态变量和互斥量来保证线程安全。由于静态变量和互斥量是在程序运行时自动初始化的,因此可以保证在第一次调用 getInstance 方法时创建单例实例。此外,为了防止通过拷贝构造函数和赋值运算符创建新的实例,我们将其禁止。

Java实现单例模式:

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

在上面的实现中,我们使用了静态变量来保存单例实例,并通过 getInstance 方法来获取该实例。由于静态变量是在类加载时自动初始化的,因此可以保证在第一次调用 getInstance 方法时创建单例实例。此外,为了防止通过构造函数创建新的实例,我们将其私有化。


在多线程环境中,单例模式需要考虑线程安全性,否则可能会创建多个实例。以下是使用双重检查锁定实现线程安全的单例模式的Java代码:

public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在上面的实现中,我们使用了双重检查锁定来保证线程安全。
首先,在第一次调用 getInstance 方法时,如果实例未被创建,多个线程可能会同时进入第一个 if 语句块。因此,我们需要使用同步块来保证只有一个线程可以创建实例。然后,在同步块内部,我们再次检查实例是否已被创建。这是因为,如果多个线程在第一个 if 语句块之后进入同步块,其中一个线程可能已经创建了实例。因此,我们需要再次检查实例是否已被创建,以避免创建多个实例。最后,我们使用 volatile 修饰实例变量,以确保在多线程环境下,所有线程都可以正确地读取和写入实例变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值