Python考试题--第69道题目--程序锁是什么,怎样使用线程锁--2022年04月24日
原创目录
1.线程锁的定义:
1线程锁的核心目的是:
为了确保数据的一致性,线程锁中的资源(变量)被锁定,以避免偷偷篡改其他线程。以达到我们预期的效果。也就是说,异步变量同步。
2,为什么需要线程锁:
由于多个线程在同时完成特定操作的过程中可能会中断,因此在执行其他操作时可能会产生脏数据。
例如,一个线程读取一个变量。n,[初始值为0],然后n++,最终输出n。当访问n++在被中断之后,还有另一个线程在做同样的工作。在这个时候n被加了2次,所以n最后等于2,而不是1。
3如何使用线程锁:
1,模式一:acquire()和release()都是成对的。经常会出现死锁。release不执行死刑。
import threading
#创建锁定对象
lock = threading.Lock()
#获取锁
lock.acquire()
#释放锁
lock.release()
2,模式二:with它可以自动获取和释放锁,这可以防止我们忘记释放锁而导致死锁。
import threading
lock = threading.Lock()
with lock:
#业务代码
pass
2.示例代码演示:
1使用线程锁:一个线程完成后,继续下一个线程。
import random
from time import sleep, ctime
from threading import Thread, Lock, currentThread
from atexit import register
lock = Lock()
print(type(lock))
def fun():
lock.acquire() # 加锁
for i in range(4):
print("Thread Name","=",currentThread().name,"i","=",i)
sleep(random.randint(1,5))
lock.release() # 解锁
def main():
for i in range(3):
Thread(target=fun).start()
@register
def exit():
print("线程执行已完成:", ctime())
main()
执行结果如下:

2、 如果没有线程锁,线程执行会令人困惑:
import random
from time import sleep, ctime
from threading import Thread, Lock, currentThread
from atexit import register
lock = Lock()
print(type(lock))
def fun():
# lock.acquire() # 加锁
for i in range(4):
print("Thread Name","=",currentThread().name,"i","=",i)
sleep(random.randint(1,5))
# lock.release() # 解锁
def main():
for i in range(3):
Thread(target=fun).start()
@register
def exit():
print("线程执行已完成:", ctime())
main()
执行结果:

版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123




