• 小黑腰酸背痛腿抽筋的日常积累:多线程单例模式


    错误结果的单例模式

    import threading
    import time
    
    class Singleton:
        instance = None
    
        def __init__(self, name):
            self.name = name
    
        def __new__(cls, *args, **kwargs):
            if cls.instance:
                return cls.instance
    
            time.sleep(0.1)
            cls.instance = object.__new__(cls)
            return cls.instance
    
    def task():
        obj = Singleton('x')
        print(obj)
    
    if __name__ == '__main__':
        for i in range(10):
            t = threading.Thread(target=task)
            t.start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    <main.Singleton object at 0x0000021929B00AC0>
    <main.Singleton object at 0x0000021929A67C40><main.Singleton object at 0x0000021929B0A9A0>
    <main.Singleton object at 0x0000021929A66CA0>
    <main.Singleton object at 0x0000021929AF0880><main.Singleton object at 0x0000021929B0A9A0>

    <main.Singleton object at 0x0000021929A67C40>
    <main.Singleton object at 0x000002192C8991F0>
    <main.Singleton object at 0x000002192C8BFA60><main.Singleton object at 0x0000021929A3DC10>

    Process finished with exit code 0

    加锁的单例模式

    import threading
    import time
    
    class Singleton:
        instance = None
        lock = threading.RLock()
    
        def __init__(self,name):
            self.name = name
    
        def __new__(cls,*args,**kwargs):
            with cls.lock:
                if cls.instance:
                    return cls.instance
                time.sleep(0.1)
                cls.instance = object.__new__(cls)
            return cls.instance
    def task():
        obj = Singleton('x')
        print(obj)
    
    if __name__ == '__main__':
        for i in range(10):
            t = threading.Thread(target=task)
            t.start()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    <main.Singleton object at 0x000002AD30B81AC0><main.Singleton object at 0x000002AD30B81AC0>

    <main.Singleton object at 0x000002AD30B81AC0><main.Singleton object at 0x000002AD30B81AC0>
    <main.Singleton object at 0x000002AD30B81AC0>
    <main.Singleton object at 0x000002AD30B81AC0>

    <main.Singleton object at 0x000002AD30B81AC0><main.Singleton object at 0x000002AD30B81AC0><main.Singleton object at 0x000002AD30B81AC0><main.Singleton object at 0x000002AD30B81AC0>

    加判断进一步提升性能

    import threading
    import time
    
    class Singleton:
        instance = None
        lock = threading.RLock()
    
        def __init__(self,name):
            self.name = name
    
        def __new__(cls,*args,**kwargs):
            if cls.instance:
                return cls.instance
            with cls.lock:
                if cls.instance:
                    return cls.instance
                time.sleep(0.1)
                cls.instance = object.__new__(cls)
            return cls.instance
    def task():
        obj = Singleton('x')
        print(obj)
    
    if __name__ == '__main__':
        for i in range(10):
            t = threading.Thread(target=task)
            t.start()
        data = Singleton('ssssssssss')
        print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    <main.Singleton object at 0x00000157B600B4F0><main.Singleton object at 0x00000157B600B4F0>

    <main.Singleton object at 0x00000157B600B4F0>
    <main.Singleton object at 0x00000157B600B4F0><main.Singleton object at 0x00000157B600B4F0>

    <main.Singleton object at 0x00000157B600B4F0>
    <main.Singleton object at 0x00000157B600B4F0><main.Singleton object at 0x00000157B600B4F0>

    <main.Singleton object at 0x00000157B600B4F0><main.Singleton object at 0x00000157B600B4F0>

    <main.Singleton object at 0x00000157B600B4F0>

    Process finished with exit code 0

    小黑生活

    去领取马拉松物资

    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

    晚上去按个摩啦,按了一个半小时

    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

    出发跑北京马拉松啦

    请添加图片描述
    请添加图片描述
    请添加图片描述

    看到了爱跑步的李老师和明哥请添加图片描述

    请添加图片描述
    请添加图片描述

    一起跑就跟着330的官兔

    请添加图片描述
    请添加图片描述

    跑到30km了,膝盖突然剧痛,但还是边跑边走挺过了最后的10km

    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

    马拉松掠影,感谢坚强的小黑请添加图片描述

    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

    请添加图片描述
    请添加图片描述
    ![请添加图片描述](https://img-blog.csdnimg.cn/a7aa603aa7ad4bb5a36207cf65750110.jpeg请添加图片描述

    一瘸一拐坐上了回学校的公交,跟中老黑小吃一顿请添加图片描述

    请添加图片描述

    来自网上的恐惧

    在这里插入图片描述

    通过这次马拉松,小黑会越来越坚强,约在意终点越抵达不了,享受旅途,成长自己~

  • 相关阅读:
    GOPS·2023上海站 | 提前剧透!阿里、腾讯、字节、擎创等专家齐聚上海,共话互联网运维
    Ubuntu批量新建文件
    javaScript编译器,Babel详解!
    跨境电商:YouTube视频营销必看攻略
    java通过IO流下载保存文件
    web前端开发技术纯静态 (12306官网 1页)
    【JAVA】AJAX&JSON
    JS判断一个字符串中出现次数最多的字符 统计这个次数
    服务器创建虚拟环境跑代码
    [buuctf.reverse] 117-120
  • 原文地址:https://blog.csdn.net/qq_37418807/article/details/127726826