Python单例模式实现,使用100个线程实例完成实例测试

Python实现单例模式,并且启动100个线程进行测试

import threading
import time

class Singleton(object):
    __lock = threading.Lock()
    __instance = None          # 单例对象,必须是类属性
    def __init__(self):
        pass

    def __new__(cls, *args, **kwargs):
        # 如果实例存在直接返回
        if Singleton.__instance:
            return Singleton.__instance

        # 如果实例不存在,申请锁,只有获得了锁,才能创建实例
        if Singleton.__lock.acquire():
            if Singleton.__instance == None:  # 只有对象没有年被创建,才创建
                Singleton.__instance = object.__new__(cls)
                pass
            Singleton.__lock.release() # 释放锁
            pass
        return Singleton.__instance    # 返回实例
        pass
    pass


# 测试用线程
class TestThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.__name = name
        pass
    def run(self):
        s = None
        while True:
            # time.sleep(1)
            s = Singleton()  # 创建实例
            print(s)
        pass
    pass

if __name__ == "__main__":
    # 100个线程 无限创建实例
    for i in range(100):
        t = TestThread('thread-' + str(i))
        t.start()
        pass
    pass

测试结果,所有线程得到的都是同一个实例

thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-67 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-70 : <main.Singleton object at 0x000001960A7E24A8>
thread-67 : <main.Singleton object at 0x000001960A7E24A8>
thread-40 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-15 : <main.Singleton object at 0x000001960A7E24A8>
thread-17 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>
thread-5 : <main.Singleton object at 0x000001960A7E24A8>
thread-87 : <main.Singleton object at 0x000001960A7E24A8>
thread-17 : <main.Singleton object at 0x000001960A7E24A8>
thread-69 : <main.Singleton object at 0x000001960A7E24A8>
thread-62 : <main.Singleton object at 0x000001960A7E24A8>
thread-87 : <main.Singleton object at 0x000001960A7E24A8>
thread-75 : <main.Singleton object at 0x000001960A7E24A8>
thread-84 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-7 : <main.Singleton object at 0x000001960A7E24A8>
thread-56 : <main.Singleton object at 0x000001960A7E24A8>
thread-84 : <main.Singleton object at 0x000001960A7E24A8>
thread-44 : <main.Singleton object at 0x000001960A7E24A8>
thread-0 : <main.Singleton object at 0x000001960A7E24A8>
thread-33 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>
thread-56 : <main.Singleton object at 0x000001960A7E24A8>
thread-70 : <main.Singleton object at 0x000001960A7E24A8>
thread-51 : <main.Singleton object at 0x000001960A7E24A8>
thread-56 : <main.Singleton object at 0x000001960A7E24A8>
thread-99 : <main.Singleton object at 0x000001960A7E24A8>
thread-37 : <main.Singleton object at 0x000001960A7E24A8>
thread-17 : <main.Singleton object at 0x000001960A7E24A8>
thread-14 : <main.Singleton object at 0x000001960A7E24A8>
thread-37 : <main.Singleton object at 0x000001960A7E24A8>
thread-79 : <main.Singleton object at 0x000001960A7E24A8>
thread-28 : <main.Singleton object at 0x000001960A7E24A8>
thread-69 : <main.Singleton object at 0x000001960A7E24A8>
thread-41 : <main.Singleton object at 0x000001960A7E24A8>
thread-28 : <main.Singleton object at 0x000001960A7E24A8>
thread-41 : <main.Singleton object at 0x000001960A7E24A8>
thread-38 : <main.Singleton object at 0x000001960A7E24A8>
thread-74 : <main.Singleton object at 0x000001960A7E24A8>
thread-52 : <main.Singleton object at 0x000001960A7E24A8>
thread-41 : <main.Singleton object at 0x000001960A7E24A8>
thread-46 : <main.Singleton object at 0x000001960A7E24A8>
thread-74 : <main.Singleton object at 0x000001960A7E24A8>
thread-30 : <main.Singleton object at 0x000001960A7E24A8>
thread-97 : <main.Singleton object at 0x000001960A7E24A8>
thread-7 : <main.Singleton object at 0x000001960A7E24A8>
thread-36 : <main.Singleton object at 0x000001960A7E24A8>
thread-84 : <main.Singleton object at 0x000001960A7E24A8>
thread-82 : <main.Singleton object at 0x000001960A7E24A8>
thread-67 : <main.Singleton object at 0x000001960A7E24A8>
thread-26 : <main.Singleton object at 0x000001960A7E24A8>
thread-13 : <main.Singleton object at 0x000001960A7E24A8>
thread-44 : <main.Singleton object at 0x000001960A7E24A8>
thread-83 : <main.Singleton object at 0x000001960A7E24A8>
thread-13 : <main.Singleton object at 0x000001960A7E24A8>
thread-93 : <main.Singleton object at 0x000001960A7E24A8>
thread-47 : <main.Singleton object at 0x000001960A7E24A8>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值