java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析

  1. suspend与resume

Java废弃 suspend() 去挂起线程的原因,是因为 suspend() 在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行 resume() 方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。
但是,如果 resume() 操作出现在 suspend() 之前执行,那么线程将一直处于挂起状态,同时一直占用锁,这就产生了死锁。而且,对于被挂起的线程,它的线程状态居然还是 Runnable。

  1. wait与notify

wait与notify必须配合synchronized使用,因为调用之前必须持有锁,wait会立即释放锁,notify则是同步块执行完了才释放

  1. await与singal

Condition类提供,而Condition对象由new ReentLock().newCondition()获得,与wait和notify相同,因为使用Lock锁后无法使用wait方法

  1. park与unpark

LockSupport是一个非常方便实用的线程阻塞工具,它可以在线程任意位置让线程阻塞。和Thread.suspenf()相比,它弥补了由于resume()在前发生,导致线程无法继续执行的情况。和Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出IException异常。可以唤醒指定线程。

总结

  • wait与await区别:

    • wait与notify必须配合synchronized使用,因为调用之前必须持有锁,wait会立即释放锁,notify则是同步块执行完了才释放
    • 因为Lock没有使用synchronized机制,故无法使用wait方法区操作多线程,所以使用了Condition的await来操作
  • Lock实现主要是基于AQS,而AQS实现则是基于LockSupport,所以说LockSupport更底层,所以使用park效率会高一些

更多Java优质文章,请关注猪哥微信公众号:猪哥Java!

java线程阻塞唤醒的四种方式相关推荐

  1. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  2. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...

  3. java中Map遍历的四种方式

    java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...

  4. Java 数组转List的四种方式

    Java 数组转List的四种方式 第一种方式(未必最佳):使用ArrayList.asList(strArray) ​ 使用Arrays工具类Arrays.asList(strArray)方式,转换 ...

  5. Java反射之创建对象的四种方式

    Java反射之创建对象的四种方式 1.使用new关键字 2.使用Java反射机制,反射构造器 3.使用克隆方式创建对象Cloneable 4.使用序列化Serializable 1.使用Java反射机 ...

  6. android java 多线程,Android多线程的四种方式

    当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread.通常一个应用的所有组件都运行在 ...

  7. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. 1 2 3 4 Map<Integer, Intege ...

  8. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

  9. Java 线程池原理及四种常用的线程池使用

    推荐阅读:Java线程池实现原理及其在美团业务中的实践 文章目录 什么是线程池 使用线程池的好处 线程池的实现原理 流程图分析 源码分析 线程池的使用 向线程池中提交任务 newCachedThrea ...

最新文章

  1. eclipse异常关闭,无法启动tomcat解决办法
  2. 规范的.net 事件原理
  3. linux 命令都是bash,Linux 命令分类_bash基础特性
  4. C#设计模式(7)-Singleton Pattern
  5. 了解ES6 The Dope Way第三部分:模板文字,扩展运算符和生成器!
  6. [BBS]搭建开源论坛之Jforum搭配开源CKEDITOR
  7. [html] 你有使用过ins标签吗?说说它的用途
  8. linux设置temview密码,使用64位系统安装Teamviewer,但出现依赖性错误
  9. (5)JavaScript之prompt语句
  10. mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考
  11. 总结——达内视频项目
  12. linux的解压zip文件,Linux解压zip文件命令
  13. 姓氏头像制作生成头像组合微信小程序源码
  14. ps 命令 快捷键 知识点汇总
  15. 程序猿 C语言入门 颈椎,【计时器小工具】70行代码让你远离颈椎病,致所有的程序猿们...
  16. SSM整合练习:记账管理
  17. Educational Codeforces Round 40千名记
  18. 数据结构 判断括号是否匹配
  19. Windows Server 2008 R2 SP1升级补丁
  20. 计算机科学与技术专业学点啥

热门文章

  1. python 列表拼接_【Python杂货铺】速学python基础
  2. 分布式内存数据库的CAP-BASE原理
  3. 京东AI NLP高阶实训学习笔记
  4. 机器知道哪吒是部电影吗?解读阿里巴巴概念图谱AliCG
  5. 代码+实例:深度学习中的“轴”全解
  6. 如何在visio2010的框图中插入公式?
  7. 微信小程序view动态长度_微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】...
  8. python 支付宝个人账单_解析2018年度三大用户数据报告——网易云音乐、支付宝、微信...
  9. 【Spring Boot 分享】开源项目【8个】
  10. 用姓名字段统计人数_2019年度全国各地姓名报告分析汇总(全国、深圳、佛山、杭州)...