lock和wait+signal
2019独角兽企业重金招聘Python工程师标准>>>
lock和wait+signal
在编程中,我们经常使用多线程来提升性能,所以这就涉及到互斥和同步的问题了。而在编程中,我们一般都是通过如下方式来完成多线程的互斥和同步:
- lock | unlock
- signal + wait(timeout)
- join
- sleep
C语言
在Linux C编程中,我们通常使用pthread类库来完成跨平台的多线程控制,如下是几个常用的API:
- pthread_mutex_lock():占有互斥锁(阻塞操作)
- pthread_mutex_unlock(): 释放互斥锁
- pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
- pthread_cond_wait(): 等待条件变量的特殊条件发生
- pthread_cond_timedwait():等待条件变量的特殊条件发生或者timeout
- pthread_join():阻塞当前的线程,直到另外一个线程运行结束
- sleep() : 休眠固定时间,不过这个API是Linux原生提供,不能跨平台。
注意:**pthread类库是glibc(绝大多数Linux平台标准C库。)的一部分。这些功能都是通过中断号进入内核来完成的,而非仅仅做了Linux兼容API。**具体可见 glibc-2.23\sysdeps\nacl\nacl-interface-list.h ,声明wait(timeout)功能中断号文件。
Java
在Java中,多线程的控制已经是一个统一标准了,一般都是通过Java原生API或者JUC来实现并发控制。这里来说说原生的API:
- synchronized : 实现了lock 和 unlock的功能
- Object#wait : 等待信号发生,并且可以实现超时等待
- Object#notify : 通知信号发生
- Object#notifyAll :通知信号发生
- Thread#join :阻塞当前的线程,直到另外一个线程运行结束
- Thread#sleep : 休眠固定时间
通过这些API,我们基本上能实现Java的多线程并发控制,当然了可以使用最新的JUC并发库的API。而这些API底层也是可以通过pthread这个C库来实现。
示例-Timer
Java中Timer的实现原理就是通过 wait 和 notify 以及 synchronized 来实现的:
Timer timer = new Timer();
timer.schedule(new TimerTask() {@Overridepublic void run() {}
}, 1000);
其实,Timer持有TimerImpl,其实Impl就是一个Thread实现,它一直阻塞等待task的到来,见run代码:
public void run() {while (true) {TimerTask task;synchronized (this) {// need to check cancelled inside the synchronized blockif (cancelled) {return;}//等待任务if (tasks.isEmpty()) {if (finished) {return;}// no tasks scheduled -- sleep until any task appeartry {//等待任务加入后,会通过notify来通知它可以运行this.wait();} catch (InterruptedException ignored) {}continue;}....if (timeToSleep > 0) {// sleep!try {//延迟执行代码this.wait(timeToSleep);} catch (InterruptedException ignored) {}continue;}// no sleep is necessary before launching the task...}...try {//具体执行任务task.run();taskCompletedNormally = true;} finally {...}}
}
可以看到TimerImpl的run代码会通过wait来阻塞等待任务加入queue,然后通过notify告知它可以运行task。timer#schedule最后会调用TimerImpl#insertTask,具体代码如下:
private void insertTask(TimerTask newTask) {// callers are synchronizedtasks.insert(newTask);this.notify();
}
**所以任务加入队列后,通过notify来告知阻塞在等待任务的线程(TimerImpl#run)。**这样子就实现了Timer的功能了,并且通过wait(timeout)实现了delay的功能。
总结
多线程的控制,其实大多都是依赖:
- lock
- signal + wait
这两种类型的API来完成并发控制。
而在此基础上,我们可以实现各种各样的多线程并发控制,比如说:MQ,CountDownLatch等。
转载于:https://my.oschina.net/darkgem/blog/660784
lock和wait+signal相关推荐
- 为什么await()后会执行lock.unlock,await()时不就释放锁了吗
为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...
- java await signal_【Java并发008】原理层面:ReentrantLock中 await()、signal()/signalAll()全解析...
一.前言 上篇的文章中我们介绍了AQS源码中lock方法和unlock方法,这两个方法主要是用来解决并发中互斥的问题,这篇文章我们主要介绍AQS中用来解决线程同步问题的await方法.signal方法 ...
- java lock unlock_【Java并发007】原理层面:ReentrantLock中lock()、unlock()全解析
一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...
- Lock锁与Condition详解
目录 引子 重新认识Lock接口 你了解Condition接口吗 Condition接口与示例 Condition如何实现 引子 三个线程分别打印A.B.C,要求按ABC的顺序循环打印10次. Ree ...
- 无界阻塞队列 LinkedBlockingQueue 原理探究
2019独角兽企业重金招聘Python工程师标准>>> 一.前言 本文介绍下使用独占锁实现的阻塞队列LinkedBlockingQueue的实现. 二. LinkedBlocking ...
- java线程条件变量_多线程同步条件变量(转载)
最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...
- [Cocoa]深入浅出Cocoa之多线程NSThread
深入浅出Cocoa之多线程NSThread 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 iOS ...
- 多线程基础篇(3)——初试锁
1. 锁的概念 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁). 当一个资源被一个线程操作时,会对 ...
- java并发 设计模式,Java并发——设计模式
并发模式 Ⅰ 同步模式--保护性暂停模式(Guarded Suspension) 用在一个线程等待另一个线程的执行结果.JDK中join和Future的实现就是采用此模式 image-20201227 ...
最新文章
- Spring学习总结一
- 单台web服务器性能,单台web服务器如何尽可能的提高网站性能
- android--04activity的布局管理器
- 专栏全年主题合辑-代码中文命名相关实践 2018-11-10
- 一款好用的绘制组织结构图的软件-亿图组织结构图
- 服务器能不能清理系统垃圾,在服务器上如何清理垃圾
- gst 笔记1:信号、消息、事件、状态
- Actors编程模型
- 别墅家庭无线WiFi覆盖解决方案
- 计算机机械硬盘寿命,机械硬盘的寿命
- Python Pandas 行数据筛选方法汇总
- python之父考虑重构python解释器_Python之父考虑重构Python解释器
- 机械键盘改罗技优联无线键盘
- 【标准】要点整理-软件服务商交付能力评估标准
- unityplayerpre存档_Unity3d中的PlayerPrefs游戏存档API的扩展
- 利用Python进行性能测试(上)
- Naver 向沙特 NEOM 项目推销充满机器人的智能办公室
- 【手把手教你学习51单片机】74HC138 三八译码器的应用
- 波若波罗蜜心经学习心得
- CSDN【精品专栏】第8期