zoukankan      html  css  js  c++  java
  • 单例模式

    单例模式(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 实例是否存在,第一次判断如果对象实例存在就直接返回对象就行,不需要在锁线程了。第二次判断主要是针对对象不存在的情况,多个线程同时进来,通过锁来阻塞线程。

  • 相关阅读:
    内置函数拾遗
    jQuery与其他JS库冲突解决
    ckeditor+ckfinder添加水印。
    PostgreSQL与mysql的比较
    php函数 之 iconv 不是php的默认函数,也是默认安装的模块。需要安装才能用的。
    php mb_substr()函数的详细解释!
    成为一名PHP专家其实并不难
    php中级程序员的进化标准
    鼠标经过图片切换效果。
    计算两个日期之间的工作日
  • 原文地址:https://www.cnblogs.com/whnba/p/11958616.html
Copyright © 2011-2022 走看看