在并发编程时,如果多个线程访问同一资源,我们需要保证访问的时候不会产生冲突,数据修改不会发生错误,这就是我们常说的 线程安全 。
那什么情况下,访问数据时是安全的?什么情况下,访问数据是不安全的?如何知道你的代码是否线程安全?要如何访问数据才能保证数据的安全?
本篇文章会一一回答你的问题。
1. 线程不安全是怎样的?
要搞清楚什么是线程安全,就要先了解线程不安全是什么样的。
比如下面这段代码,开启两个线程,对全局变量 number 各自增 10万次,每次自增 1。
from threading import Thread, Lock
number = 0
def target():
global number
for _ in range(1000000):
number += 1
thread_01 = Thread(target=target)
thread_02 = Thread(target=target)
thread_01.start()
thread_02.start()
thread_01.join()
thread_02.join()
print(number)
正常我们的预期输出结果,一个线程自增100万,两个线程就自增 200 万嘛,输出肯定为 2000000 。
可事实却并不是你想的那样,不管你运行多少次,每次输出的结果都会不一样,而这些输出结果都有一个特点是,都