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

  • 相关阅读:
    java生成4个不同的随机数
    前端学习(三十二)正则(笔记)
    前端学习(三十一)canvas(笔记)
    前端学习(三十)es6的一些问题(笔记)
    前端学习(二十九)nodejs(笔记)
    前端学习(二十八)es6&ajax(笔记)
    前端学习(二十七)存储&es6(笔记)
    前端学习(二十七)自动构造工具交互(笔记)
    前端学习(二十六)移动端s(笔记)
    前端学习(二十四)一些总结(笔记)
  • 原文地址:https://www.cnblogs.com/whnba/p/11958616.html
Copyright © 2011-2022 走看看