python实现synchronized

利用python的装饰器实现类似java中的synchronized

from threading import Lock,Thread
from functools import wraps

default_lock=Lock()
lock_list={'default':Lock()}
def synchronized(func=None,obj=None):
    if func is not  None:
        @wraps(func)
        def wrapper(*args,**kwargs):
            lock=lock_list['default']
            lock.acquire()
            try:
                return func(*args,**kwargs)
            finally:
                lock.release()
        return wrapper
    if obj is not None:
        cur_id=id(obj)
        default_lock.acquire()
        try:
            current_lock=lock_list.get(id(obj),None)
            if current_lock is None:
                current_lock=Lock()
                lock_list[cur_id]=current_lock
        finally:
            default_lock.release()
        def decorator(func):
            def wrapper(*args,**kwargs):
                current_lock.acquire()
                try:
                    return func(*args,**kwargs)
                finally:
                    current_lock.release()
            return wrapper
        return decorator


a=0
obj=[]
@synchronized(obj=obj)
def add():
    global a
    a+=1
@synchronized(obj=obj)
def sub():
    global a
    a-=1
'''
使用两把锁会出现错误的原因是由于可以同时有两个线程修改a,但是同一把锁就不行,因为这把锁不释放其他线程就不能操作a
'''
def task():
    for i in range(6672325):
        sub()
        add()

thread_list=[Thread(target=task) for i in range(4)]
[t.start() for t in thread_list]
[t.join() for t in thread_list]
print(a)


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值