-
多线程的锁 如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期 ''' 多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改, 因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。 https://www.liaoxuefeng.com/wiki 因此需要用锁threading.Lock(),去锁定资源(可以创建不同的锁) lock.acquire()告诉其他线程,当前线程正在占用该部分资源 lock.release()告诉其他线程,当前线程已使用完此部分资源 '''
- 线程的join方法
''' join方法主要是会阻塞主线程,在子线程结束运行前,主线程会被阻塞等待。 join方法的timeout参数表示了主线程被每个子线程阻塞等待的时间。 '''
# 如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期
'''
多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,
因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。
https://www.liaoxuefeng.com/wiki
因此需要用锁threading.Lock(),去锁定资源(可以创建不同的锁)
lock.acquire()告诉其他线程,当前线程正在占用该部分资源
lock.release()告诉其他线程,当前线程已使用完此部分资源
'''
import time, threading
balance = 0
lock = threading.Lock() # 这里只是定义一个锁,命名为lock
def change(n):
global balance # 多线程是共享资源的,使用全局变量
balance = balance + n
balance = balance - n
def run_thread(n):
for i in range(30000):
lock.acquire() # 获取锁
try:
change(n)
finally:
lock.release() # 释放锁,让其他线程使用balance资源
t1 = threading.Thread(target=run_thread, args=(5,)) # 创建一个thread实例,即一个新线程
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start() # 调用start()开始执行线程
t2.start()
'''
join方法主要是会阻塞主线程,在子线程结束运行前,主线程会被阻塞等待。
join方法的timeout参数表示了主线程被每个子线程阻塞等待的时间。
如果这里没加join方法,只用了线程锁,那么程序结果依旧会不可预期
'''
t1.join()
t2.join()
print(balance)