示例1:
import threading
lock_object = threading.RLock()
loop = 10000000
number = 0
def _add(count):
lock_object.acquire() #加锁
global number
for i in range(count):
number += 1
lock_object.release() #释放锁
def _sub(count):
lock_object.acquire()
global number
for i in range(count):
number -= 1
lock_object.release()
t1 = threading.Thread(target = _add,args = (loop,))
t2 = threading.Thread(target = _sub,args = (loop,))
t1.start()
t2.start()
t1.join()
t2.join()
print(number)
#结果
0
示例2:
未加锁
import threading
num = 0
def task():
global num
for i in range(1000000):
num += 1
print(num)
for i in range(2):
t = threading.Thread(target = task)
t.start()
#结果
1119385
1226630
上锁后
import threading
num = 0
lock_object = threading.RLock()
def task():
print("开始")
lock_object.acquire() #第一个抵达的线程进入并上锁,其它线程就需要在此等待
global num
for i in range(1000000):
num += 1
lock_object.release() #线程西湖区,并解开锁,其它线程就可以进入并执行
print(num)
for i in range(2):
t = threading.Thread(target = task)
t.start()
#结果
开始
开始
1000000
2000000
基于上下文管理自动加锁
import threading
num = 0
lock_object = threading.RLock()
def task():
print("开始")
with lock_object:#基于上下文管理,内部自动执行acquire 和 release
global num
for i in range(1000000):
num += 1
print(num)
for i in range(2):
t = threading.Thread(target = task)
t.start()
#结果
开始
开始
1000000
2000000
内置线程安全

image.png
网友评论