条件锁Condition
"""
设计场景:timo先说一句,亚索再说一句
timo: timo队长正在待命
yasuo: 面对疾风吧
timo: timo整装待发
yasuo: 哈杀gay
"""
我们最先想到就是使用Lock一人轮流说一句,看下效果:

实际下效果发现好像不一样:

那么如何控制他们按照合理的顺序去你说一句我回答一局好像聊天一样呢:
那么就需要引进条件锁:
什么是条件锁:
条件变量总是与某种锁定相关联。可以传入,也可以默认创建一个。当多个条件变量必须共享同一锁时,传递一个输入很有用。锁是条件对象的一部分:您不必单独跟踪它。
条件变量遵循上下文管理协议:使用该with语句在封闭块的持续时间内获取关联的锁。该acquire()和 release()方法也调用相关的锁的相应方法。
必须使用关联的锁来调用其他方法。该 wait()方法释放该锁,然后阻塞直到另一个线程通过调用notify()或 唤醒它notify_all()。唤醒后,wait() 重新获取锁并返回。也可以指定超时。
该notify()方法唤醒等待条件变量的线程之一(如果有的话)。该notify_all() 方法唤醒所有等待条件变量的线程。
注意:notify()和notify_all()方法不会释放锁;这意味着唤醒的一个或多个线程不会wait()立即从其调用中返回,而仅在调用notify()或notify_all() 最终放弃该锁的所有权的线程中返回。
典型的使用条件变量的编程风格使用锁来同步对某些共享状态的访问。对状态的特定更改感兴趣的线程会wait()反复调用,直到看到所需的状态为止;而对状态调用进行修改的线程notify()或notify_all()更改状态的线程可能会成为其中一个等待者所需的状态,则线程会反复调用 它们。例如,以下代码是具有无限缓冲区容量的一般生产者-消费者情况:


实现应答效果:

条件锁Condition的更多相关文章
- 条件锁condition与Queue()
在学习之前你应该先了解锁和队列基础 import queue import time import random import threading import asyncio import logg ...
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- python线程condition条件锁应用实例
import time import threading # 吃火锅鱼丸 guo = [] suo = threading.Condition() #条件锁 # 生产者负责生产 class Produ ...
- python线程条件变量Condition(31)
对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...
- Python的条件锁与事件共享
1:事件机制共享队列: 利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题要求:readthread读时,writethread不能写:writethread写时,readthre ...
- 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁
重入锁 Java中的重入锁(即ReentrantLock) 与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...
- 关于一点pthread_cond_t条件锁的思考以及实验
转:http://blog.csdn.net/aniao/article/details/5802015 APUE上,关于条件锁.其中有这么几条总结: 1.使用条件锁前必须先锁住对应的互斥锁. 2.条 ...
- Linux 开发之线程条件锁那些事
2019独角兽企业重金招聘Python工程师标准>>> 条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发.一个常用的例子就是在线程中无限循环执 ...
随机推荐
- Linux 使用vim命令编辑文件内容
在终端可以使用vim命令来直接编辑文件内容. vim,也可以叫做vi. vim有三种模式:命令模式.输入模式.底线命令模式. 命令模式 vim 文件名 进入命令模式,vim也可以写成vi. 如果 ...
- Python123——测验1: Python基本语法元素 (第1周)程序题2总结
一.题目 二.解析 (1)官方解析 (2)个人解析 def m1(): """ 法1:暴力破解""" s1 = input('') s2 = ...
- for循环嵌套练习题or99乘法表
//输出1-10之间的和 public static void whileTest(){ //定义变量用于存储不断变化的和 int sum = 0; //定义变量,用于记录不断变化的被加数 int x ...
- JS高阶编程技巧--柯理化函数
首先看一段代码: let obj = { x: 100 }; function fn(y) { this.x += y; console.log(this); } 现在有一个需求:在1秒后,执行函数f ...
- MySQL基础(1) | 数据类型
MySQL基础(1) | 数据类型 数值类型 TINYINT #小整数值,1 字节,有符号(-128,127),无符号(0,255) SMALLINT #大整数值,2 字节 MEDIUMINT #大整 ...
- 通过vsphere给esxi添加本地硬盘
公司ESXi服务器的硬盘空间不够使用,现在新加了一块硬盘在ESxi服务器上.在服务器上添加完硬盘后,在Vsphere上是看不到新加硬盘的. 下面我们来通过虚拟机模拟该情况,先添加一块硬盘.如下图: 在 ...
- 13 年的 Bug 调试经验总结 【转载】
在<Learning From Your Bugs>一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug.最近,我回顾了我所有的194个条目(从13岁开始),看看有什么经验教训是我可 ...
- 抛弃VMware吧,使用Win10自带的Hyper-V创建虚拟机
个人博客 地址:https://www.wenhaofan.com/article/20190619221449 介绍 Hyper-V是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化. 启动 ...
- MySQL int(1) 与 int(3) 的区别
1.占用的字节都一样,只是容纳字符个数有区别. int(1): 一个字符. int(3): 三个字符. 2.另外要注意的是,无符号整数,自动左侧0填充宽度. int(3),插入值5,会变成005存储. ...
- Xamarin.Forms登录对话框及表单验证
微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏. Xamarin.Forms登录系统 内容目录 实现效果 业务场景 编码实现 ...