线程锁Lock

from threading import Thread, Lock
import time


def func():
    global n
    n -= 1


n = 10
t_list = []
for i in range(10):
    t = Thread(target=func,)
    t_list.append(t)
    t.start()
for t in t_list:
    t.join()
print(n)

这段代码结果我们知道,因为GIL的原因,结果是0

再看如下代码:

from threading import Thread, Lock
import time


def func():
    global n
    temp = n
    time.sleep(0.1)
    n = temp - 1


n = 10
t_list = []
for i in range(10):
    t = Thread(target=func,)
    t_list.append(t)
    t.start()
for t in t_list:
    t.join()
print(n)

打印结果却是9

为什么呢?

因为在0.1秒之内,所有线程肯定都进来了,但是需要睡0.1秒,这就是阻塞状态,他们会把手里的数据让给其他线程,所以每个线程的temp都是10,阻塞结束,10减1全变成9都写入内存,最终n的值就是9了,这样就导致数据的不安全了。

怎么改进?加锁就可以了

from threading import Thread, Lock
import time


def func(lock):
    lock.acquire()
    global n
    temp = n
    time.sleep(0.1)
    n = temp - 1
    lock.release()


lock =Lock()
n = 10
t_list = []
for i in range(10):
    t = Thread(target=func, args=(lock,))
    t_list.append(t)
    t.start()
for t in t_list:
    t.join()
print(n)

这样打印的结果就是0了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值