65 - 请解释什么是线程锁,以及如何使用线程锁
请解释什么是线程锁,以及如何使用线程锁
- 线程锁: 目的是将一段代码锁住,一旦获得锁权限,除非释放线程锁,否则其他任何代码都无法获得锁权限
- 为什么需要线程锁
- 多线程同时在完成特定的操作时,由于并不是原子操作,所以在完成操作的过程中可能会被打断,去做其他的操作
- 可能产生脏数据
- 例如,一个线程读取变量n 【初始值是0】,然后n++, 最后输出n,当访问n++后,被打断,由另外的线程做同样的工作,这时n被加了2次,所以n最后等于2,而不是1
from atexit import register
from threading import Thread, Lock, currentThread
from time import sleep, ctime
import randomlock = 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()
<class '_thread.lock'>
Thread Name = Thread-13 i = 0
Thread Name = Thread-13 i = 1
Thread Name = Thread-13 i = 2
Thread Name = Thread-13 i = 3
Thread Name = Thread-13 i = 4
Thread Name = Thread-14 i = 0
Thread Name = Thread-14 i = 1
Thread Name = Thread-14 i = 2
Thread Name = Thread-14 i = 3
Thread Name = Thread-14 i = 4
Thread Name = Thread-15 i = 0
Thread Name = Thread-15 i = 1
Thread Name = Thread-15 i = 2
Thread Name = Thread-15 i = 3
Thread Name = Thread-15 i = 4
from atexit import register
from threading import Thread, Lock, currentThread
from time import sleep, ctime
import randomlock = 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()
<class '_thread.lock'>
Thread Name = Thread-16 i = 0
Thread Name = Thread-17 i = 0
Thread Name = Thread-18 i = 0
Thread Name = Thread-16 i = 1
Thread Name = Thread-17 i = 1
Thread Name = Thread-18 i = 1
Thread Name = Thread-17 i = 2
Thread Name = Thread-16 i = 2
Thread Name = Thread-17 i = 3
Thread Name = Thread-18 i = 2
Thread Name = Thread-18 i = 3
Thread Name = Thread-18 i = 4
Thread Name = Thread-17 i = 4
Thread Name = Thread-16 i = 3
Thread Name = Thread-16 i = 4
66 - 请解释什么是信号量,以及如何使用信号量
65 - 请解释什么是线程锁,以及如何使用线程锁相关推荐
- Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信
为什么80%的码农都做不了架构师?>>> Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...
- python线程安全_线程,线程安全与python的GIL锁
在看的过程中,接触到一个名词,一个从学python开始就一直看到,但是从来都是一知半解的名词,心里不开心,必须把它搞明白,对了,这个词就是 GIL.网上搜索了一些资料,粗浅的理解了什么是GIL,自己感 ...
- php 线程锁,如何使用python线程锁(实例解析)
在这篇文章之中我们来了解一下什么是python线程锁.了解一下python线程锁的相关知识,以及线程锁在python编程之中能起到什么样的作用. 线程锁(互斥锁Mutex) 一个进程下可以启动多个线程 ...
- python全局解释锁_Python GIL 全局解释性锁介绍
什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...
- java线程锁机制_多线程之锁机制
前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...
- 递归锁、信号量、GIL锁、基于多线程的socket通信和进程池线程池
递归锁.信号量.GIL锁.基于多线程的socket通信和进程池线程池 递归锁 死锁现象:是指两个或两个以上的进程和线程因抢夺计算机资源而产生的一种互相等待的现象 from threading impo ...
- Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)
文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...
- 线程同步与互斥:互斥锁
为什么需要互斥锁? 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源.这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西, ...
- java判断线程阻塞_记一次锁使用不当导致Dubbo线程阻塞问题
背景 线上环境一个后台项目,提供基于dubbo实现的事件分发服务,最近突然出现心跳超时. 问题分析 检查内存是否溢出 jstat -gcutil 8166 1000 意料之中,内存正常,因为内部有接入 ...
最新文章
- redhat linux新建用户,linux redhat 添加用户
- 函数嵌套 lisp表达式求值
- 手把手教你搭建Linux开发环境(VMware+Ubuntu)(二)——安装VMwareTools并设置共享文件夹
- 监控linux空间变化,Linux监控文件变化及主动上报实现
- 回到顶部和回到底部动画
- 话题:什么是前端工程化?
- 从文件夹中读取所有文件的指定内容,按行读取。
- java利用poi导出数据到excel
- 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行
- F30.2018年版本北大中文核心期刊目录
- 《你是三月的小桨》光剑
- 解决Mac版 snipaste 不在菜单栏显示,无法修改快捷键
- Java找不到对象的警告_程序猿的24个段子:程序员找不到对象 一般有三种情况...
- 【人工智能】机器学习西瓜书11——经验误差与过拟合,模型评估的方法,均方误差,错误率与精度,最优阈值
- Angular4与PrimeNG
- 蓝桥杯:解救小哈最短路径
- 黑马优购uni-app
- docker 网络模式研究了许久,其实我们需要的是docker run -p 80:80命令
- linux系统下的程序开发报告册,linux系统及其应用(应用开发)实验报告册.doc
- excel如何打开多个独立窗口