一.线程不安全
多个线程之间应该是相互独立,互不干扰的,但有的时候,线程所操作的对象有可能是共享资源,例如多个线程同时操作一个文件或操作一个全局变量,会对数据产生破坏或不可预知的操作,这种现象称为线程不安全,如下所示:
"""
以对银行的存取款为例,频繁的存入一笔钱,然后立刻取出相同数目的钱,最后的钱数仍然应该是0,但是在线程不安全的情况下,最后的余额是不可预知的
"""
import threading
# 设置一个全局变量,为银行的存款
deposit = 0
lock = threading.Lock()
def change_it(n):
# 声明global_variable为全局变量
global deposit
# 存入一个数目的钱
deposit = deposit + n
# 立刻取走相同的钱
deposit = deposit - n
def run_thread(n):
for i in range(1000000):
change_it(n)
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(deposit)
输入:
8
二.Threading.Lock互斥锁
利用互斥锁在某一刻将资源锁定:
import threading
# 设置一个全局变量,为银行的存款
deposit = 0
lock = threading.Lock()
def change_it(n):
# 声明global_variable为全局变量
global deposit
# 存入一个数目的钱
deposit = deposit + n
# 立刻取走相同的钱
deposit = deposit - n
def run_thread(n):
for i in range(100000):
# 获取锁
lock.acquire()
try:
# 进行存取款
change_it(n)
finally:
# 存取款后释放锁
lock.release()
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(deposit)
输出:
0