首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >65 - 请解释什么是线程锁,以及如何使用线程锁

65 - 请解释什么是线程锁,以及如何使用线程锁

原创
作者头像
ruochen
修改2021-06-11 10:05:16
修改2021-06-11 10:05:16
5310
举报

请解释什么是线程锁,以及如何使用线程锁

  • 线程锁: 目的是将一段代码锁住,一旦获得锁权限,除非释放线程锁,否则其他任何代码都无法获得锁权限
  • 为什么需要线程锁
    • 多线程同时在完成特定的操作时,由于并不是原子操作,所以在完成操作的过程中可能会被打断,去做其他的操作
    • 可能产生脏数据
    • 例如,一个线程读取变量n 【初始值是0】,然后n++, 最后输出n,当访问n++后,被打断,由另外的线程做同样的工作,这时n被加了2次,所以n最后等于2,而不是1
代码语言:txt
复制
from atexit import register
from threading import Thread, Lock, currentThread
from time import sleep, ctime
import random

lock = Lock()
print(type(lock))

def fun():
    lock.acquire()  # 加锁
    for i in range(5):
        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()
代码语言:txt
复制
<class '_thread.lock'>
代码语言:txt
复制
Thread Name = Thread-13 i = 0
代码语言:txt
复制
Thread Name = Thread-13 i = 1
代码语言:txt
复制
Thread Name = Thread-13 i = 2
代码语言:txt
复制
Thread Name = Thread-13 i = 3
代码语言:txt
复制
Thread Name = Thread-13 i = 4
代码语言:txt
复制
Thread Name = Thread-14 i = 0
代码语言:txt
复制
Thread Name = Thread-14 i = 1
代码语言:txt
复制
Thread Name = Thread-14 i = 2
代码语言:txt
复制
Thread Name = Thread-14 i = 3
代码语言:txt
复制
Thread Name = Thread-14 i = 4
代码语言:txt
复制
Thread Name = Thread-15 i = 0
代码语言:txt
复制
Thread Name = Thread-15 i = 1
代码语言:txt
复制
Thread Name = Thread-15 i = 2
代码语言:txt
复制
Thread Name = Thread-15 i = 3
代码语言:txt
复制
Thread Name = Thread-15 i = 4
代码语言:txt
复制
from atexit import register
from threading import Thread, Lock, currentThread
from time import sleep, ctime
import random

lock = Lock()
print(type(lock))

def fun():
    # lock.acquire()  # 加锁
    for i in range(5):
        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()
代码语言:txt
复制
<class '_thread.lock'>
代码语言:txt
复制
Thread Name = Thread-16 i = 0
代码语言:txt
复制
Thread Name = Thread-17 i = 0
代码语言:txt
复制
Thread Name = Thread-18 i = 0
代码语言:txt
复制
Thread Name = Thread-16 i = 1
代码语言:txt
复制
Thread Name = Thread-17 i = 1
代码语言:txt
复制
Thread Name = Thread-18 i = 1
代码语言:txt
复制
Thread Name = Thread-17 i = 2
代码语言:txt
复制
Thread Name = Thread-16 i = 2
代码语言:txt
复制
Thread Name = Thread-17 i = 3
代码语言:txt
复制
Thread Name = Thread-18 i = 2
代码语言:txt
复制
Thread Name = Thread-18 i = 3
代码语言:txt
复制
Thread Name = Thread-18 i = 4
代码语言:txt
复制
Thread Name = Thread-17 i = 4
代码语言:txt
复制
Thread Name = Thread-16 i = 3
代码语言:txt
复制
Thread Name = Thread-16 i = 4

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 请解释什么是线程锁,以及如何使用线程锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档