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相关推荐

  1. 为什么await()后会执行lock.unlock,await()时不就释放锁了吗

    为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...

  2. java await signal_【Java并发008】原理层面:ReentrantLock中 await()、signal()/signalAll()全解析...

    一.前言 上篇的文章中我们介绍了AQS源码中lock方法和unlock方法,这两个方法主要是用来解决并发中互斥的问题,这篇文章我们主要介绍AQS中用来解决线程同步问题的await方法.signal方法 ...

  3. java lock unlock_【Java并发007】原理层面:ReentrantLock中lock()、unlock()全解析

    一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...

  4. Lock锁与Condition详解

    目录 引子 重新认识Lock接口 你了解Condition接口吗 Condition接口与示例 Condition如何实现 引子 三个线程分别打印A.B.C,要求按ABC的顺序循环打印10次. Ree ...

  5. 无界阻塞队列 LinkedBlockingQueue 原理探究

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 本文介绍下使用独占锁实现的阻塞队列LinkedBlockingQueue的实现. 二. LinkedBlocking ...

  6. java线程条件变量_多线程同步条件变量(转载)

    最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...

  7. [Cocoa]深入浅出Cocoa之多线程NSThread

    深入浅出Cocoa之多线程NSThread 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 iOS ...

  8. 多线程基础篇(3)——初试锁

    1. 锁的概念 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁). 当一个资源被一个线程操作时,会对 ...

  9. java并发 设计模式,Java并发——设计模式

    并发模式 Ⅰ 同步模式--保护性暂停模式(Guarded Suspension) 用在一个线程等待另一个线程的执行结果.JDK中join和Future的实现就是采用此模式 image-20201227 ...

最新文章

  1. Spring学习总结一
  2. 单台web服务器性能,单台web服务器如何尽可能的提高网站性能
  3. android--04activity的布局管理器
  4. 专栏全年主题合辑-代码中文命名相关实践 2018-11-10
  5. 一款好用的绘制组织结构图的软件-亿图组织结构图
  6. 服务器能不能清理系统垃圾,在服务器上如何清理垃圾
  7. gst 笔记1:信号、消息、事件、状态
  8. Actors编程模型
  9. 别墅家庭无线WiFi覆盖解决方案
  10. 计算机机械硬盘寿命,机械硬盘的寿命
  11. Python Pandas 行数据筛选方法汇总
  12. python之父考虑重构python解释器_Python之父考虑重构Python解释器
  13. 机械键盘改罗技优联无线键盘
  14. 【标准】要点整理-软件服务商交付能力评估标准
  15. unityplayerpre存档_Unity3d中的PlayerPrefs游戏存档API的扩展
  16. 利用Python进行性能测试(上)
  17. Naver 向沙特 NEOM 项目推销充满机器人的智能办公室
  18. 【手把手教你学习51单片机】74HC138 三八译码器的应用
  19. 波若波罗蜜心经学习心得
  20. CSDN【精品专栏】第8期

热门文章

  1. 【设计】线框图、原型和视觉稿的区别
  2. android recovery模式及ROM制作
  3. JAVA中利用DOM解析XML文档
  4. AIX命令参考大全,卷 4,n - r
  5. MVC架构中的Repository模式 个人理解
  6. .NET MD5加密解密代码
  7. iOS - 打电话, 发短信
  8. 解决后退,清空验证码(其它文本框保留)
  9. JS:两个json数组合并、去重,以及删除某一项元素
  10. Angular Universal 官网翻译