Python中线程安全的单例模式实现

2023-04-03 00:00:00 python 模式 中线

在Python中实现线程安全的单例模式,可以使用模块级别的变量来实现。模块级别的变量在Python中是全局变量,所以它们的作用域是整个模块,而不是函数或类。因此,模块级别的变量在不同的线程中是共享的,可以实现线程安全的单例模式。

下面是一个示例代码,实现了一个线程安全的单例模式,用于创建一个名为“pidancode.com”或“皮蛋编程”的对象。

import threading

class Singleton:
    _instance_lock = threading.Lock()
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            with cls._instance_lock:
                if not cls._instance:
                    cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance

class MyObject(Singleton):
    def __init__(self, name):
        self.name = name

# 使用示例
obj1 = MyObject("pidancode.com")
obj2 = MyObject("皮蛋编程")
print(obj1.name)  # 输出 "pidancode.com"
print(obj2.name)  # 输出 "pidancode.com"
print(obj1 is obj2)  # 输出 "True"

在这个示例中,Singleton是一个单例模式的基类,它使用一个双重锁机制来确保线程安全。MyObject类继承自Singleton,并在其构造函数中初始化了一个名为name的属性。使用MyObject类创建的对象将始终是同一个对象,无论在多少个线程中创建它们。

在Singleton类中,_instance是一个私有的类变量,用于存储单例对象的实例。当_instance为None时,表示还没有创建实例,需要通过锁机制来创建实例。在锁内部再次检查_instance是否为None,以确保在锁内部创建实例。如果已经创建了实例,直接返回实例即可。这种双重锁机制可以确保只有一个线程在同一时间内创建实例。

在MyObject类中,继承自Singleton,所以它也可以通过双重锁机制来确保线程安全的创建单例对象。MyObject类的构造函数需要一个name参数,用于初始化name属性。

在使用示例中,我们创建了两个MyObject对象,分别将name属性设置为pidancode.com和皮蛋编程,并输出它们的name属性。由于使用了单例模式,两个对象的name属性都是pidancode.com,并且两个对象是同一个对象,obj1 is obj2输出True。

相关文章