java线程阻塞唤醒的四种方式
java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析
- suspend与resume
Java废弃 suspend() 去挂起线程的原因,是因为 suspend() 在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行 resume() 方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。
但是,如果 resume() 操作出现在 suspend() 之前执行,那么线程将一直处于挂起状态,同时一直占用锁,这就产生了死锁。而且,对于被挂起的线程,它的线程状态居然还是 Runnable。
- wait与notify
wait与notify必须配合synchronized使用,因为调用之前必须持有锁,wait会立即释放锁,notify则是同步块执行完了才释放
- await与singal
Condition类提供,而Condition对象由new ReentLock().newCondition()获得,与wait和notify相同,因为使用Lock锁后无法使用wait方法
- 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线程阻塞唤醒的四种方式相关推荐
- java读取XML文件的四种方式
java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...
- java中Map遍历的四种方式
java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...
- Java 数组转List的四种方式
Java 数组转List的四种方式 第一种方式(未必最佳):使用ArrayList.asList(strArray) 使用Arrays工具类Arrays.asList(strArray)方式,转换 ...
- Java反射之创建对象的四种方式
Java反射之创建对象的四种方式 1.使用new关键字 2.使用Java反射机制,反射构造器 3.使用克隆方式创建对象Cloneable 4.使用序列化Serializable 1.使用Java反射机 ...
- android java 多线程,Android多线程的四种方式
当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread.通常一个应用的所有组件都运行在 ...
- Java遍历Map对象的四种方式
关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. 1 2 3 4 Map<Integer, Intege ...
- Java实现文件复制的四种方式
背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...
- Java 线程池原理及四种常用的线程池使用
推荐阅读:Java线程池实现原理及其在美团业务中的实践 文章目录 什么是线程池 使用线程池的好处 线程池的实现原理 流程图分析 源码分析 线程池的使用 向线程池中提交任务 newCachedThrea ...
最新文章
- eclipse异常关闭,无法启动tomcat解决办法
- 规范的.net 事件原理
- linux 命令都是bash,Linux 命令分类_bash基础特性
- C#设计模式(7)-Singleton Pattern
- 了解ES6 The Dope Way第三部分:模板文字,扩展运算符和生成器!
- [BBS]搭建开源论坛之Jforum搭配开源CKEDITOR
- [html] 你有使用过ins标签吗?说说它的用途
- linux设置temview密码,使用64位系统安装Teamviewer,但出现依赖性错误
- (5)JavaScript之prompt语句
- mysql数据类型选择_MySQL学习笔记(二):MySQL数据类型汇总及选择参考
- 总结——达内视频项目
- linux的解压zip文件,Linux解压zip文件命令
- 姓氏头像制作生成头像组合微信小程序源码
- ps 命令 快捷键 知识点汇总
- 程序猿 C语言入门 颈椎,【计时器小工具】70行代码让你远离颈椎病,致所有的程序猿们...
- SSM整合练习:记账管理
- Educational Codeforces Round 40千名记
- 数据结构 判断括号是否匹配
- Windows Server 2008 R2 SP1升级补丁
- 计算机科学与技术专业学点啥
热门文章
- python 列表拼接_【Python杂货铺】速学python基础
- 分布式内存数据库的CAP-BASE原理
- 京东AI NLP高阶实训学习笔记
- 机器知道哪吒是部电影吗?解读阿里巴巴概念图谱AliCG
- 代码+实例:深度学习中的“轴”全解
- 如何在visio2010的框图中插入公式?
- 微信小程序view动态长度_微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】...
- python 支付宝个人账单_解析2018年度三大用户数据报告——网易云音乐、支付宝、微信...
- 【Spring Boot 分享】开源项目【8个】
- 用姓名字段统计人数_2019年度全国各地姓名报告分析汇总(全国、深圳、佛山、杭州)...