美文网首页
线程安全(锁)

线程安全(锁)

作者: 测试探索 | 来源:发表于2022-01-21 22:27 被阅读0次
示例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

相关文章

网友评论

      本文标题:线程安全(锁)

      本文链接:https://www.haomeiwen.com/subject/fdnuhrtx.html