Python学习笔记——多线程锁

  1. 多线程的锁
    ​​​​​​​如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期 
    ''' 多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改, 因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。 https://www.liaoxuefeng.com/wiki 因此需要用锁threading.Lock(),去锁定资源(可以创建不同的锁) lock.acquire()告诉其他线程,当前线程正在占用该部分资源 lock.release()告诉其他线程,当前线程已使用完此部分资源 '''
    
  2. 线程的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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值