利用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)