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


    错误结果的单例模式

    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请添加图片描述

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

    请添加图片描述

    来自网上的恐惧

    在这里插入图片描述

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

  • 相关阅读:
    小众却又极其实用的5款办公软件,建议收藏转发
    OpenAI GPT-4 Turbo发布:开创AI新时代
    GD32 单片机 硬件I2C死锁解决方法
    SpringBoot + Apache tika 轻松实现各种文档内容解析
    Google Earth Engine(GEE)——checkbox的使用
    Leetcode 01-算法入门与数组-②数组基础
    虎扑论坛数据分析
    Java中的值传递与引用传递 含面试题
    Codeforces Round #833 (Div. 2) A-D.md
    【SwinTransformer源码阅读二】Window Attention和Shifted Window Attention部分
  • 原文地址:https://blog.csdn.net/qq_37418807/article/details/127726826