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。
相关文章