Python全系列 教程
3567个小节阅读:5929.9k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
我们可以通过“锁机制”来实现线程同步问题,锁机制有如下几个要点:
互斥锁是什么?
互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作。
注意: 互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程需要等待,等互斥锁使用完释放后,其它等待的线程再去抢这个锁。
threading
模块中定义了Lock
变量,这个变量本质上是一个函数,通过调用这个函数可以获取一把互斥锁。
【示例】多线程操作同一个对象(增加互斥锁,使用线程同步)
xxxxxxxxxx
#encoding=utf-8
from threading import Thread,Lock
from time import sleep
class Account:
def __init__(self,money,name):
self.money = money
self.name = name
#模拟提款操作
class Drawing(Thread):
def __init__(self,drawingNum,account):
Thread.__init__(self)
self.drawingNum = drawingNum
self.account = account
self.expenseTotal = 0
def run(self):
lock1.acquire()
if self.account.money-self.drawingNum<0:
return
sleep(1) #判断完后阻塞。其他线程开始运行。
self.account.money -= self.drawingNum;
self.expenseTotal += self.drawingNum;
lock1.release()
print(f"账户:{self.account.name},余额是:{self.account.money}")
print(f"账户:{self.account.name},总共取了:{self.expenseTotal}")
if __name__ == '__main__':
a1 = Account(100,"gaoqi")
lock1 = Lock()
draw1 = Drawing(80,a1) #定义取钱线程对象;
draw2 = Drawing(80,a1) #定义取钱线程对象;
draw1.start() #你取钱
draw2.start() #你老婆取钱
acquire
和release
方法之间的代码同一时刻只能有一个线程去操作- 如果在调用
acquire
方法的时候 其他线程已经使用了这个互斥锁,那么此时acquire
方法会堵塞,直到这个互斥锁释放后才能再次上锁。
实时效果反馈
1. 如下关于互斥锁的代码,空白处填写的代码是:
xxxxxxxxxx
lock1._______()
if self.account.money-self.drawingNum<0:
return
sleep(1) #判断完后阻塞。其他线程开始运行。
self.account.money -= self.drawingNum;
self.expenseTotal += self.drawingNum;
lock1._______()
A release
release
B acquire
release
C acquire
acquire
D release
acquire
答案
1=>B