单例模式

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

单线程——实例

例子:在现实生活中,只有一个太阳,如果出现多个太阳将是不可象限的。

采用单例模式来构造一个太阳

class Sun:
    def __new__(cls):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)
        return cls._instance

这个例子在单线程中是没问题的,如果在多线程中那么可能会对象被多次创建的情况。因为在系统中多线程是模拟时间分片来实现的。会出现这种情况:A线程执行完not hasattr(cls, ‘_instance’)时,发现对象还没有创建,然后进入下一行,这时A线程执行时间到了切换到B线程,B线程进行判断发现对象没有创建,这时就会去创建对象,执行完成之后切换到A线程,A线程将从上次暂停的地方接着执行,这时又创建了一个对象。这种情况下就无法保存对象的唯一性了。

多线程——实例

class Sun:
    def __new__(cls):
        if not hasattr(cls,'_instance'):
            lock = threading.Lock()
            with lock:
                if not hasattr(cls,'_instance'):
                    cls._instance = super().__new__(cls)
        return cls._instance

引入线程锁,通过枷锁与解锁方式来保存对象的唯一性。这里进行了2次判断 _instance 实例是否存在,第一次判断如果对象实例存在就直接返回对象就行,不需要在锁线程了。第二次判断主要是针对对象不存在的情况,多个线程同时进来,通过锁来阻塞线程。

原文地址:https://www.cnblogs.com/whnba/p/11958616.html